You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在JMeter中嵌套循环迭代CSV并实现并行处理?

JMeter配置方案:双CSV嵌套遍历+并行处理

一、CSV数据集配置

先给两个CSV文件分别配置读取组件:

  • CSV A读取配置

    • 添加「CSV数据集配置」,命名为CSV_A_Reader
    • 文件名填入CSV A的本地/绝对路径
    • 变量名设为foo,bar,baz(对应CSV的三列)
    • 循环模式选择「All rows」,共享模式设为「当前线程组」
    • 勾选「允许引用数据」,分隔符保持默认逗号
  • CSV B读取配置

    • 添加「CSV数据集配置」,命名为CSV_B_Reader
    • 文件名填入CSV B的本地/绝对路径
    • 变量名设为qux
    • 循环模式选择「All rows」,共享模式设为「当前线程组」
    • 勾选「每次迭代重置」,确保每次遍历CSV B时都从第一行开始

二、嵌套循环结构搭建

按以下层级组织组件:

  1. 线程组(并行处理核心载体)
    • 外层循环控制器:命名为遍历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

火山引擎 最新活动