如何在 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 有效负载。
更多信息:
- Apache Groovy - Creating XML
- Apache Groovy - Why and How You Should Use It
- Jmeter SOAP parameterization with dynamically changing tag blocks
我花了一天时间,但我终于找到了我需要的解决方案。将代码留在这里以防它对某人有帮助。
再次感谢 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>
我想使用 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 有效负载。
更多信息:
- Apache Groovy - Creating XML
- Apache Groovy - Why and How You Should Use It
- Jmeter SOAP parameterization with dynamically changing tag blocks
我花了一天时间,但我终于找到了我需要的解决方案。将代码留在这里以防它对某人有帮助。 再次感谢 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>