我可以看到用户定义的变量只能用字符串值填充变量。有没有办法在用户定义变量元素中填充对象引用用户定义变量。
我尝试过将 UDV 值设为 ${__groovy(new java.util.concurrent.ConcurrentHashMap())}
之类的东西。但是这种方式会导致稍后从变量中检索到一些字符串。
我什至尝试使用用户定义变量 groovy 脚本(如 ${__groovy(vars.putObject("key", new java.util.concurrent.ConcurrentHashMap(); "assigned")}
)的副作用。但是这个会导致一些 JMeter 编译错误,而在我看来,它在语法上是不错的 groovy 脚本。
我曾尝试使用脚本预处理器放在测试计划之上,就像建议的 SO 答案之一一样,但它们在树中的每个采样器之前工作,因此不符合预期。
在测试计划初始化阶段,我仍然找不到在 JMeter 中初始化对象引用变量的方法,从而劫持了初始化 UDV 的线程。
我知道在脚本元素(如 JSR223/BeanShell/其他一些采样器/预处理器等)中使用 putObject(<key>, <reference value>)
填充变量的可能性。
但是我想在测试计划的初始化时为我的所有线程组填充变量,以避免使用道具对每个 put/get 调用施加同步锁惩罚。并且不可能在测试计划的顶部添加采样器。
EDIT 在接受 Dmitri T 的正确答案后(对于那些想立即以更清晰的形式知道答案的人):
${__groovy(vars.putObject("<key>"\, new HashMap()); "virtually anything")}
是在 UDV 测试计划元素中填充对象引用变量的正确(虽然是间接的)方法。
答案 0 :(得分:1)
虽然在我看来是语法上不错的 groovy 脚本。
这只是你的意见,看看jmeter.log file,你会在那里看到解释错误
<块引用>如果函数参数包含逗号,那么一定要用“\
”将其转义,否则 JMeter 会将其视为参数分隔符。例如:
${__time(EEE\, d MMM yyyy)}
正确的语法如下:
${__groovy(vars.putObject('key'\,new java.util.concurrent.ConcurrentHashMap()),)}
演示: