如何在ForEach Controller中使用数组数据?跨线程组传递equipmentNumber
跨线程组共享多值equipmentNumber + ForEach Controller实现方案
第一步:第一个线程组把提取到的equipmentNumber存为全局属性
配置JSON Extractor:
- 变量名填
equipmentNumber - JSON Path表达式根据接口返回结构写,比如
$..equipmentNumber(确保能匹配所有equipmentNumber字段) - 匹配数字选
-1(提取所有符合条件的项)
配置完成后,JMeter会自动生成equipmentNumber_1、equipmentNumber_2...这类变量,还有equipmentNumber_matchNr(记录提取结果的总数量)。
- 变量名填
在JSON Extractor所在的请求后添加JSR223 PostProcessor,用Groovy代码将变量存入全局属性(实现跨线程组访问):
def totalCount = vars.get("equipmentNumber_matchNr") as int // 先存储总数量 props.put("equipmentTotal", totalCount.toString()) // 逐个存储每个equipmentNumber for (int i = 1; i <= totalCount; i++) { def num = vars.get("equipmentNumber_" + i) props.put("equipmentNumber_" + i, num) }
第二步:第二个线程组用ForEach Controller遍历使用
在第二个线程组最前端添加JSR223 PreProcessor,把全局属性同步成本地线程组变量(ForEach Controller仅识别当前线程组的变量):
def total = props.get("equipmentTotal") as int vars.put("equipmentNumber_matchNr", total.toString()) for (int i = 1; i <= total; i++) { def num = props.get("equipmentNumber_" + i) vars.put("equipmentNumber_" + i, num) }添加ForEach Controller并配置参数:
- 输入变量前缀:
equipmentNumber - 输出变量名:
currentEquipment(自定义名称,用于存储每次循环拿到的单个编号) - 循环起始索引:
1 - 循环结束索引:留空(自动读取
equipmentNumber_matchNr的数值) - 勾选"Add "_"" before number(保持默认勾选,和我们的变量命名格式匹配)
- 输入变量前缀:
在ForEach Controller内部放置需要使用编号的请求,直接用
${currentEquipment}引用当前循环的equipmentNumber即可,控制器会自动遍历所有提取到的编号。
额外需求:让第二个线程组多用户各用一个编号
如果第二个线程组开启了多线程(模拟多用户),想让每个用户对应不同的equipmentNumber,可不用ForEach Controller:
- 先完成上述全局属性同步步骤。
- 在请求中用以下函数引用编号:
线程号从0开始,+1后刚好对应${__groovy(props.get("equipmentNumber_" + (ctx.getThreadNum() + 1)),)}equipmentNumber_1、equipmentNumber_2...,实现每个线程匹配唯一编号。
内容的提问来源于stack exchange,提问作者Valay Bhatt
相关产品推荐
相关产品推荐

