我正在尝试在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>
[听起来像是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
提供测试计划树的屏幕快照或文本表示可能会有所帮助,因为我怀疑您的范围存在问题。
作为一种解决方法,您可以用JSR223采样器替换JSR223预处理器,并将其以正确的顺序放入测试计划中。为避免该采样器出现在结果中,您可以使用prev.setIgnore()