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

问题描述 投票:0回答:2

我正在尝试在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>
groovy jmeter preprocessor jsr223
2个回答
0
投票

[听起来像是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


0
投票

提供测试计划树的屏幕快照或文本表示可能会有所帮助,因为我怀疑您的范围存在问题。

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

附加一个JSR223后处理器
© www.soinside.com 2019 - 2024. All rights reserved.