【问题标题】:How to dynamically create an XML object in the jmeter PreProcessor如何在 jmeter PreProcessor 中动态创建 XML 对象
【发布时间】:2021-12-01 18:22:23
【问题描述】:

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

<?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 对象,并用不同的一小部分内容填充每个&lt;pa&gt; &lt;/pa&gt; 对象(例如示例只是在每个子 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 对象。 任何帮助将不胜感激。

【问题讨论】:

    标签: groovy jmeter xml-parsing jsr223 xmlslurper


    【解决方案1】:

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

    更多信息:

    【讨论】:

    • 谢谢。您能否告诉我如何将此结果打印到 jmeter 日志以及如何从 JSR223 预处理器中获取内容以在 jmeter 请求中使用?示例: new MarkupBuilder().root { a( a1:'one' ) { b { mkp.yield( '3 3 废话
    • 要将某些内容打印到 jmeter.log 文件,请使用 log 速记,例如 log.info('Hello')。要将某些内容存储到 JMeter 变量中,请使用 vars 速记,例如 vars.put('Hello', 'JustNatural')。然后在您的请求中使用${Hello}。更多信息:Top 8 JMeter Java Classes You Should Be Using with Groovy。请记住,JMeterVariables 默认情况下是字符串,因此您需要在存储之前将对象转换为字符串。 log 简写也是如此,它只能打印字符串。
    • 是的,这是我的问题,事实上我不知道如何将他们在您的第一个链接 MarkupBuilder 顶部给出的这个示例的结果转换或转换为字符串。他们说它会将以下内容打印到 System.out 这似乎是我需要的,但是如果我尝试将该示例代码分配给一个变量然后执行 log.info(variable) 它不起作用。
    【解决方案2】:

    我花了一天的时间,但我终于找到了我需要的解决方案。将代码留在这里以防它对某人有所帮助。 再次感谢 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>
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2011-04-29
      • 2011-03-25
      相关资源
      最近更新 更多