如何在 jmeter 预处理器中动态创建一个 XML 对象

How to dynamically create an XML object in the jmeter PreProcessor

我想使用 Jmeter 组合一个动态大小的 XML 对象,其中包含动态生成的内容,在 JSR223 预处理器中具有如下结构:

<?xml version="1.0" encoding="UTF-8"?>
<aaa id1="TD00100" id2="005" date="2021-09-06T09:49:57.623Z" id3="Minoan007">
    <p>
        <pa outOfScope="false" inTransit="false" reqID="ID00001">
            <location arrivalDate="2021-09-20" code="ASD" departureDatetime="2021-09-20T11:00:00.000Z" scheduleNo="AB123">
            </location>
            <docs dob="1960-09-02" expiryDate="2031-09-13" gen="f" givenName="Test1" anotherCode="AB" anotherCode2="ABC" surname="John" docNr="100000001" docType="J">
            </docs>
        </pa>
        <pa eesetiasOutOfScope="false" inTransit="false" pReqID="ID00002">
            <location arrivalDate="2021-09-20" code="ASD" departureDatetime="2021-09-20T11:00:00.000Z" scheduleNo="AB123">
            </location>
            <docs dob="1960-09-02" expiryDate="2031-09-13" gen="m" givenName="Test2" anotherCode="AB" anotherCode2="ABC" surname="John" docNr="100000002" docType="J">
            </docs>
        </pa>
        <pa eesetiasOutOfScope="false" inTransit="false" pReqID="ID00003">
            <location arrivalDate="2021-09-20" code="ASD" departureDatetime="2021-09-20T11:00:00.000Z" scheduleNo="AB123">
            </location>
            <docs dob="1960-09-02" expiryDate="2031-09-13" gen="f" givenName="Test3" anotherCode="AB" anotherCode2="ABC" surname="John" docNr="100000003" docType="J">
            </docs>
        </pa>       
    </p>
</aaa>

我想要一个带有静态主体的 HTTP 采样器,例如:

<?xml version="1.0" encoding="UTF-8"?>
<aaa id1="TD00100" id2="005" date="2021-09-06T09:49:57.623Z" id3="Minoan007">
    <p>
        ${xmlObject}
    </p>
</aaa>

并且在 ${xmlObject} 中,我想放置一个 自定义大小的 XML 对象,该对象基于一些变量 填充每个 <pa> </pa> 对象的一小部分内容有所不同(例如,只是在每个子 xml 对象中将 id 增加 1),基于一些自定义计数器。像这个例子。假设我定义一个等于 100 的变量:当脚本运行时,它会生成一个包含 100 个子对象的对象,其结构如下:

<pa .... reqID="ID00001">...</pa> objects
</pa>
<pa .... reqID="ID00002">...</pa> objects
</pa>
<pa .... reqID="ID00003">...</pa> objects
</pa>    

....n

<pa .... reqID="n">...</pa> objects
</pa>  

然后我只需要使用 vars.put 将它移动到 Jmeter 变量并在我的 HTTP 请求中使用它。

我使用 JSR223 预处理器中的 JsonSlurper 为 JSON 对象从逻辑角度做了一些相同的事情。我只是不知道使用什么以及如何使用它来生成我的自定义 XML 对象。 任何帮助将不胜感激。

由于您的“某些内容有所不同”和“基于某些自定义计数器”节并不能说明什么,我只能建议看一下 MarkupBuilder class提供所有必要的功能以动态构建 XML 有效负载。

更多信息:

我花了一天时间,但我终于找到了我需要的解决方案。将代码留在这里以防它对某人有帮助。 再次感谢 Dmitri T 用这些资源为我指明了正确的方向。

def numberOfNodes = 3 // set how many sub-nodes are needed

def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer)


xml.rootNode() {
createRootNode(xml, numberOfNodes, 'ID0000')
}

def createRootNode(builder, repeat, reqID) {
   for (int i = 0 ; i < repeat ; i++) {
       builder.pa(outOfScope:'false', inTransit:'false', reqID:reqID+(i+1).toString() ){
        builder.location (arrivalDate:'2021-09-20', code:'ASD', departureDatetime:'2021-09-20T11:00:00.000Z', scheduleNo:'LH8912')
        builder.docs( dob:'1960-09-02' , expiryDate:'2031-09-13', gen:'female', givenName:'Test3', anotherCode:'ABC', anotherCode2:'AB', surname:'John', docNr: 100000001, travelDocType:'J' )
       }
    }
}

def nodeAsText = writer.toString()
log.info(nodeAsText) // print to jmeter log console

vars.put('nodes3XmlObj', nodeAsText) //put the variable as a string into a variable accesible for jmeter

Jmeter 日志控制台中的结果:

2021-10-13 23:05:28,222 INFO o.a.j.m.J.JSR223 PreProcessor: <rootNode>
  <pa outOfScope='false' inTransit='false' reqID='ID00001'>
    <location arrivalDate='2021-09-20' code='ASD' departureDatetime='2021-09-20T11:00:00.000Z' scheduleNo='LH8912' />
    <docs dob='1960-09-02' expiryDate='2031-09-13' gen='female' givenName='Test3' anotherCode='ABC' anotherCode2='AB' surname='John' docNr='100000001' travelDocType='J' />
  </pa>
  <pa outOfScope='false' inTransit='false' reqID='ID00002'>
    <location arrivalDate='2021-09-20' code='ASD' departureDatetime='2021-09-20T11:00:00.000Z' scheduleNo='LH8912' />
    <docs dob='1960-09-02' expiryDate='2031-09-13' gen='female' givenName='Test3' anotherCode='ABC' anotherCode2='AB' surname='John' docNr='100000001' travelDocType='J' />
  </pa>
  <pa outOfScope='false' inTransit='false' reqID='ID00003'>
    <location arrivalDate='2021-09-20' code='ASD' departureDatetime='2021-09-20T11:00:00.000Z' scheduleNo='LH8912' />
    <docs dob='1960-09-02' expiryDate='2031-09-13' gen='female' givenName='Test3' anotherCode='ABC' anotherCode2='AB' surname='John' docNr='100000001' travelDocType='J' />
  </pa>
</rootNode>