动态变量vars.put取值问题:按要求设键为i时,如何获取vars.get("i")全部值?
哈哈,这个问题我之前在用JMeter做接口自动化的时候也碰到过!本质是循环结束后变量i停在了最后一次迭代的数值(也就是2),所以你直接用vars.get("i")只能拿到最后一次存储的键,自然只能获取到aaa2。其实之前的aaa1并没有丢,只是需要换种方式存储或者读取才能拿到所有值,给你两种实用的解决办法:
方法一:用列表批量存储,后续按需读取
这种方式适合在同一个线程组内使用,方便后续一次性获取所有值:
- 初始化列表:在循环开始前(比如Test Plan开头或者循环控制器的前置位置),加一个JSR223元件,写入以下代码初始化一个ArrayList:
// 创建一个空列表并存在JMeter变量里 def valueList = new ArrayList() vars.putObject("allValues", valueList)
- 循环内存储值:在循环里的JSR223元件中,把每次生成的值同时加到列表里,也可以保留单独的键值对(方便按索引读取):
def currentI = vars.get("i") def currentValue = "aaa" + currentI // 添加到全局列表 vars.getObject("allValues").add(currentValue) // 同时按i的值存单独的键值对(可选) vars.put("value_" + currentI, currentValue)
- 读取所有值:后续要获取所有值的话,直接取出列表遍历就行:
// 获取整个值列表 def allValues = vars.getObject("allValues") // 遍历输出所有值 allValues.each { val -> log.info("存储的值:" + val) } // 也可以按索引取单个值,比如第一个值 log.info("第一个值:" + allValues.get(0)) // 或者通过单独的键取i=1对应的值 log.info("i=1对应的值:" + vars.get("value_1"))
方法二:用全局属性存储(跨线程组可用)
如果需要跨线程组读取这些值,就不能用vars(它是线程局部变量),得用JMeter的全局属性props:
- 循环内存储:在循环的JSR223元件里写入:
def currentI = vars.get("i") props.put("value_" + currentI, "aaa" + currentI)
- 读取所有值:后续可以遍历所有以指定前缀开头的属性,或者直接按键读取:
// 遍历所有存储的value_开头的属性 props.each { key, val -> if (key.startsWith("value_")) { log.info(key + "对应的内容:" + val) } } // 直接读取i=1对应的值 log.info("i=1对应的值:" + props.get("value_1"))
补充说明
你之前的写法里,aaa1其实已经存在vars里了,只是循环结束后i的值是2,所以vars.get(vars.get("i"))等价于vars.get("2"),只能拿到aaa2。如果只是想单独拿aaa1,直接写vars.get("1")就行,但要批量获取所有值,还是上面的两种方法更高效。
内容的提问来源于stack exchange,提问作者blue
相关产品推荐
相关产品推荐

