首页 > 解决方案 > 是否可以在 JMeter 中添加对象引用用户定义的变量?

问题描述

我可以看到用户定义的变量只能用字符串值填充变量。有没有办法在用户定义的变量元素中填充对象引用用户定义的变量。

我曾尝试将 UDV 值设为${__groovy(new java.util.concurrent.ConcurrentHashMap())}. 但是这种方式会导致稍后从变量中检索到一些字符串。我什至尝试使用用户定义变量 groovy 脚本的副作用,例如${__groovy(vars.putObject("key", new java.util.concurrent.ConcurrentHashMap(); "assigned")}. 但是在我看来,这会导致一些 JMeter 编译错误,同时在语法上是好的 groovy 脚本。我曾尝试使用脚本预处理器放在测试计划之上,就像建议的 SO 答案之一,但它们在树中的每个采样器之前工作,因此不符合预期。

在测试计划初始化阶段劫持线程初始化 UDV 时,我仍然找不到在 JMeter 中初始化对象引用变量的方法。

我知道putObject(<key>, <reference value>)在脚本元素(如 JSR223/BeanShell/其他一些采样器/预处理器等)中填充变量的可能性。但我想在测试计划的初始化时为所有线程组填充变量以避免使用道具对每个 put/get 调用施加同步锁定惩罚。并且不可能在测试计划的顶部添加采样器。

在接受 Dmitri T 的正确答案后进行编辑(对于那些想立即以更清晰的形式知道答案的人):

${__groovy(vars.putObject("<key>"\, new HashMap()); "virtually anything")}

在 UDV 测试计划元素中填充对象引用变量是正确的(虽然是间接的)方法。

标签: jmeter

解决方案


在我看来,虽然在语法上是好的 groovy 脚本。

这只是您的意见,请查看jmeter.log 文件,您会在那里看到解释错误

根据JMeter 文档

如果函数参数包含逗号,请务必使用 " \"对其进行转义,否则 JMeter 会将其视为参数分隔符。例如:

${__time(EEE\, d MMM yyyy)}

正确的语法类似于:

${__groovy(vars.putObject('key'\,new java.util.concurrent.ConcurrentHashMap()),)}

演示:

在此处输入图像描述

更多信息:Apache JMeter 函数 - 简介


推荐阅读