如何在JMeter中嵌套循环迭代CSV并实现并行处理?
JMeter配置方案:双CSV嵌套遍历+并行处理
一、CSV数据集配置
先给两个CSV文件分别配置读取组件:
CSV A读取配置
- 添加「CSV数据集配置」,命名为
CSV_A_Reader - 文件名填入CSV A的本地/绝对路径
- 变量名设为
foo,bar,baz(对应CSV的三列) - 循环模式选择「All rows」,共享模式设为「当前线程组」
- 勾选「允许引用数据」,分隔符保持默认逗号
- 添加「CSV数据集配置」,命名为
CSV B读取配置
- 添加「CSV数据集配置」,命名为
CSV_B_Reader - 文件名填入CSV B的本地/绝对路径
- 变量名设为
qux - 循环模式选择「All rows」,共享模式设为「当前线程组」
- 勾选「每次迭代重置」,确保每次遍历CSV B时都从第一行开始
- 添加「CSV数据集配置」,命名为
二、嵌套循环结构搭建
按以下层级组织组件:
- 线程组(并行处理核心载体)
- 外层循环控制器:命名为
遍历CSV_A所有行- 循环次数留空(由CSV_A_Reader的「All rows」模式自动控制遍历全量行)
- CSV_A_Reader(放在循环控制器内,确保每次循环取一行数据)
- JSR223前置处理器:拆分
baz的UUID列表
代码(Groovy):// 拆分逗号分隔的UUID列表 def bazArray = vars.get("baz").split(",") // 存储列表长度,供中层循环使用 vars.put("bazTotal", String.valueOf(bazArray.size())) // 用线程号区分存储,避免并行线程数据冲突 props.put("bazList_${__threadNum}", bazArray) - 中层循环控制器:命名为
遍历单个baz UUID- 循环次数设为
${bazTotal} - JSR223前置处理器:获取当前循环的UUID
代码(Groovy):def threadId = __threadNum.get() def bazList = props.get("bazList_${threadId}") // 循环从1开始,列表索引从0开始,所以减1 def currentBaz = bazList.get(vars.getIteration() - 1) vars.put("currentBaz", currentBaz.trim()) - 内层循环控制器:命名为
遍历CSV_B所有行- 循环次数留空(由CSV_B_Reader的「All rows」模式控制)
- CSV_B_Reader(放在内层循环内,每次循环取一行数据)
- 采样器(如HTTP请求):在请求参数中直接使用
${foo}、${currentBaz}、${qux} - JSR223后置处理器(可选):重置CSV_B读取指针,避免下一次遍历残留
代码(Groovy):ctx.getSamplerContext().remove("CSV_B_Reader")
- 循环次数设为
- 外层循环控制器:命名为
三、并行处理设置
- 在线程组配置中,将「线程数」设置为所需并行数量(如5、10,根据服务器承载能力调整)
- 确保所有CSV数据集的「共享模式」为「当前线程组」,避免不同线程的读取操作互相干扰
- 建议先测试单线程运行正常后,再逐步增加并行数,防止资源耗尽
四、调试与验证
- 添加「查看结果树」组件,检查每个请求的参数是否匹配预期:
foo对应CSV_A的UUID,currentBaz是拆分后的单个UUID,qux对应CSV_B的哈希值 - 添加「聚合报告」,监控请求的响应时间、成功率等核心指标
内容的提问来源于stack exchange,提问作者Oyee




