You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态变量vars.put取值问题:按要求设键为i时,如何获取vars.get("i")全部值?

哈哈,这个问题我之前在用JMeter做接口自动化的时候也碰到过!本质是循环结束后变量i停在了最后一次迭代的数值(也就是2),所以你直接用vars.get("i")只能拿到最后一次存储的键,自然只能获取到aaa2。其实之前的aaa1并没有丢,只是需要换种方式存储或者读取才能拿到所有值,给你两种实用的解决办法:

方法一:用列表批量存储,后续按需读取

这种方式适合在同一个线程组内使用,方便后续一次性获取所有值:

  1. 初始化列表:在循环开始前(比如Test Plan开头或者循环控制器的前置位置),加一个JSR223元件,写入以下代码初始化一个ArrayList:
// 创建一个空列表并存在JMeter变量里
def valueList = new ArrayList()
vars.putObject("allValues", valueList)
  1. 循环内存储值:在循环里的JSR223元件中,把每次生成的值同时加到列表里,也可以保留单独的键值对(方便按索引读取):
def currentI = vars.get("i")
def currentValue = "aaa" + currentI
// 添加到全局列表
vars.getObject("allValues").add(currentValue)
// 同时按i的值存单独的键值对(可选)
vars.put("value_" + currentI, currentValue)
  1. 读取所有值:后续要获取所有值的话,直接取出列表遍历就行:
// 获取整个值列表
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:

  1. 循环内存储:在循环的JSR223元件里写入:
def currentI = vars.get("i")
props.put("value_" + currentI, "aaa" + currentI)
  1. 读取所有值:后续可以遍历所有以指定前缀开头的属性,或者直接按键读取:
// 遍历所有存储的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:16:27