【问题标题】:Not able to pass variable value in sampler's HTTP request which is created using groovy scripting in JSR223 Preprocessor in Jmeter无法在采样器的 HTTP 请求中传递变量值,该请求是使用 Jmeter 中的 JSR223 预处理器中的 groovy 脚本创建的
【发布时间】:2020-04-03 15:33:10
【问题描述】:

我正在尝试使用 JSR223 预处理器中的 groovy 脚本创建一个哈希,然后将其传递给父 HTTP 请求的正文数据,但我不确定我做错了什么。当我在线程组中有一个 HTTP 请求时,它不起作用,但如果它有两个 HTTP 请求,那么它适用于第二个请求。 注意:变量 HASH 是在第一次请求后设置的。虽然我已经尝试将预处理器作为第一个 HTTP 请求的子级,或者在 HTTP 请求之前将其放入线程组,但没有任何效果。

脚本数据:

import java.security.MessageDigest
def requestBody = sampler.getArguments().getArgument(0).getValue()
def data = new XmlParser().parseText(requestBody)
String method=data.method.text()
String token=data.token.text()
String time=data.time.text()
String xyz ='method'+method+'token'+token+'time'+time+'3VDEY-6ZHLH-D27C0-T2ALI'
String hash = MessageDigest.getInstance("MD5").digest(xyz.bytes).encodeHex().toString()
vars.put("HASH", hash)

HTTP 请求正文数据:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <method>ping</method>
    <token>-</token>
    <time>1575542978</time>
    <signature>${HASH}</signature>
    <params/>
</root>

测试计划图片

https://drive.google.com/file/d/1vGbwyDo8eWUDL7EDZlK8bdbApxtFpWGT/view?usp=sharing https://drive.google.com/file/d/1Us6tSuRw6MJ__YrnX0tTCKL8S9QSgp-v/view?usp=sharing https://drive.google.com/file/d/10hobprJcga6_y23VWd5U3X1aaSEXzGkb/view?usp=sharing

【问题讨论】:

    标签: groovy jmeter preprocessor jsr223


    【解决方案1】:

    这听起来像是 JMeter 中的一个错误,我建议通过 JMeter Bugzilla 提出问题

    与此同时,您可以直接在请求正文中替换 JMeter Variable 并用新生成的哈希替换“旧”请求正文。

    建议的代码修改:

    import java.security.MessageDigest
    def requestBody = sampler.getArguments().getArgument(0).getValue()
    def data = new XmlParser().parseText(requestBody)
    String method=data.method.text()
    String token=data.token.text()
    String time=data.time.text()
    String xyz ='method'+method+'token'+token+'time'+time+'3VDEY-6ZHLH-D27C0-T2ALI'
    String hash = MessageDigest.getInstance("MD5").digest(xyz.bytes).encodeHex().toString()
    requestBody = requestBody.replace('${HASH}', hash)
    def args = new org.apache.jmeter.config.Arguments()
    sampler.setArguments(args)
    sampler.addNonEncodedArgument('', requestBody, '')
    sampler.setPostBodyRaw(true)
    

    有关 JMeter 中 Groovy 脚本的更多信息:Apache Groovy - Why and How You Should Use It

    【讨论】:

      【解决方案2】:

      提供测试计划树的屏幕截图或文本表示可能会有所帮助,因为我怀疑您在此处遇到范围问题。

      作为一种解决方法,您可以将 JSR223 PreProcessor 替换为 JSR223 Sampler,并将其以正确的顺序放入您的测试计划中。为避免该采样器出现在您的结果中,您可以使用 prev.setIgnore() 附加一个 JSR223 PostProcessor

      【讨论】:

      • 嗨,我已经分享了上面链接中的图片
      • 好的。我在这里迷路了。它适用于我的最小示例和 JMeter 5.1.1。正文:&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;root&gt; &lt;signature&gt;${HASH}&lt;/signature&gt; &lt;/root&gt; 预处理器:vars.put("HASH", "some_processed_hash") 产生预期的请求正文:&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;root&gt; &lt;signature&gt;some_processed_hash&lt;/signature&gt; &lt;/root&gt;
      猜你喜欢
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多