需要帮助解决 Jmeter BeanShell 预处理器的问题,我使用下面的代码来获取变量数据并作为下一个 POST 请求传递,但它失败了,尽管我可以看到所有变量都被正确捕获。
请帮助确定导致问题的原因
int keys = Integer.parseInt(vars.get("getkeys_matchNr"));
StringBuilder requestBuilder = new StringBuilder();
requestBuilder.append("[");
for (int i = 1; i <= keys; i++) {
requestBuilder.append(vars.get("getkeys_" + i));
if (i != keys) {
requestBuilder.append(",");
}
}
requestBuilder.append("]");
sampler.getArguments().getArgument(0).setValue(requestBuilder.toString());
出现以下错误:
2023-11-01 12:51:12,275 错误 o.a.j.u.BeanShellInterpreter:调用 bsh 方法时出错:eval 源文件:内联求值:``int keys = Integer.parseInt(vars.get("getkeys_ . . . ''):尝试解析未定义变量或类名的方法:toString():out
尝试将 setValue 设置为不同的字符串 - "sampler.getArguments().getArgument(0).setValue(out.toString(0));"但也没用
我在代码中没有看到任何
out
对象的声明,很可能是复制粘贴问题,尝试将 out
替换为 requestBuilder
,问题就会消失。
使用 Beanshell 也是某种形式的性能反模式,从 JMeter 3.1 开始,您应该使用 JSR223 测试元素和 Groovy 语言 进行脚本编写。
示例代码:
def requestBuilder = []
1.upto(vars.get('getkeys_matchNr') as int, { index ->
requestBuilder.add(vars.get('getkeys_' + index))
})
def payload = new org.apache.jmeter.protocol.http.util.HTTPArgument('', new groovy.json.JsonBuilder(requestBuilder).toPrettyString(), '')
def arguments = sampler.getArguments()
arguments.addArgument(payload)
sampler.setArguments(arguments)
更多信息: