JMeter中Groovy脚本如何不使用采样器保存变量
根因说明
循环控制器的循环次数配置栏内编写的Groovy脚本,运行在测试元件初始化阶段,此时JMeter未向Groovy运行环境注入vars、ctx、prev等线程上下文内置变量,直接调用vars.put()相关方法会抛出MissingPropertyException错误,导致循环控制器无法解析循环次数,最终循环逻辑完全不执行,和Groovy环境本身的方法识别能力无关。
无额外采样器的变量存储实现
不需要新增任何采样器,直接在当前循环次数的Groovy脚本内即可完成变量存储,根据测试场景选择对应写法即可:
- 单线程测试场景
直接调用JMeter静态工具类操作全局属性存储值,全局属性不需要依赖上下文注入,可直接调用。注意脚本最后必须返回整数类型值作为循环次数,否则控制器会默认循环次数为0,不执行任何循环:
后续所有测试元件可直接通过// 替换为你实际的随机数生成逻辑,示例为生成1-10范围内的随机整数 def val = org.apache.commons.lang3.RandomUtils.nextInt(1, 11) // 将val存入全局属性 org.apache.jmeter.util.JMeterUtils.setProperty("val", val.toString()) // 返回值作为循环控制器的循环次数 return val${__P(val,)}函数引用存储的val值。 - 多线程并发测试场景
全局属性是JVM级共享变量,多线程并发写入时会出现值互相覆盖的问题,给属性名拼接当前线程名称作为唯一标识即可避免冲突:
后续元件通过def val = org.apache.commons.lang3.RandomUtils.nextInt(1, 11) // 获取当前线程名作为属性名后缀,隔离不同线程的存储值 def threadTag = Thread.currentThread().getName() org.apache.jmeter.util.JMeterUtils.setProperty("val_${threadTag}", val.toString()) return val${__P(val_${__threadName},)}即可读取当前线程对应的val值,不会出现跨线程值串扰。
注意:循环次数配置栏的脚本执行阶段,线程组尚未启动,不存在线程私有变量上下文,没有任何方法可以在这个阶段直接操作
vars对象存储线程级变量,全局属性是当前约束下唯一可行的无额外采样器存储方案。
内容的提问来源于stack exchange,提问作者roozbeh_al
相关产品推荐
相关产品推荐

