无法在采样器中传递变量值';在Jmeter的JSR223预处理器中使用groovy脚本创建的HTTP请求

无法在采样器中传递变量值';在Jmeter的JSR223预处理器中使用groovy脚本创建的HTTP请求,groovy,jmeter,preprocessor,jsr223,Groovy,Jmeter,Preprocessor,Jsr223,我试图在JSR223预处理器中使用groovy脚本创建一个散列,然后将其传递给父HTTP请求的主体数据,但我不确定哪里做错了。当线程组中有一个HTTP请求时,它就不工作了,但是如果它有两个HTTP请求,那么它就可以处理第二个请求。 注意:变量哈希是在第一个请求之后设置的。虽然我尝试过将预处理器作为第一个HTTP请求的子级,或者在HTTP请求之前将其放入线程组,但没有任何效果 脚本数据: import java.security.MessageDigest def requestBody = sa

我试图在JSR223预处理器中使用groovy脚本创建一个散列,然后将其传递给父HTTP请求的主体数据,但我不确定哪里做错了。当线程组中有一个HTTP请求时,它就不工作了,但是如果它有两个HTTP请求,那么它就可以处理第二个请求。 注意:变量哈希是在第一个请求之后设置的。虽然我尝试过将预处理器作为第一个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)
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <method>ping</method>
    <token>-</token>
    <time>1575542978</time>
    <signature>${HASH}</signature>
    <params/>
</root>
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)
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <method>ping</method>
    <token>-</token>
    <time>1575542978</time>
    <signature>${HASH}</signature>
    <params/>
</root>

发出砰的声响
-
1575542978
${HASH}
测试计划图像


这听起来像是JMeter中的一个bug,我建议通过

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

建议的守则修订:

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脚本的更多信息:

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


作为一种解决方法,您可以使用JSR223采样器替换JSR223预处理器,并将其以正确的顺序放入测试计划中。为了避免在结果中显示采样器,您可以使用
prev.setIgnore()。我在这里迷路了。我只需要一个简单的例子和JMeter 5.1.1就可以了。正文:
${HASH}
预处理器:
vars.put(“HASH”,“some\u processed\u HASH”)
生成预期的请求正文:
some\u processed\u HASH