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

如何让Ultimate Thread Group所有线程使用CSV全部值作为输入?

嘿,这个需求我之前做批量输入校验的时候刚好踩过坑,给你两个实用的实现思路,结合Ultimate Thread Group完全能满足你的要求:

方案1:CSV Data Set Config + 循环控制器(最直观易维护)

这个方法适合CSV行数固定或容易获取总行数的场景,每个线程会独立遍历CSV的所有行:

  • 先添加CSV Data Set Config,配置好你的文件路径、要提取的变量名(比如inputKey和inputValue),关键设置要改这几个:
    • Recycle on EOF:设为False(到文件末尾就停止循环读取)
    • Stop thread on EOF:设为False(不要让线程遍历完CSV就直接终止)
    • Sharing mode:选Current thread(每个线程单独维护自己的CSV读取位置,互不干扰)
  • 添加一个循环控制器,把循环次数设置为CSV文件的总行数:
    • 如果行数固定,直接填数字就行;如果行数动态变化,可以用JMeter函数${__CSVRead(你的CSV文件路径,0)}提前获取总行数(注意要先跳过表头的话,得减1)
  • 把你的业务校验逻辑(比如HTTP请求、响应断言)放到循环控制器里面,这样每个线程启动后,会循环执行校验逻辑,每次取CSV的下一行数据,直到遍历完所有行
方案2:JSR223预处理器全量加载CSV(适合小文件场景)

如果你的CSV文件不大,可以一次性把所有数据加载到线程变量里,再逐个遍历,灵活性更高:

  • 添加JSR223 PreProcessor,放在Ultimate Thread Group下面,用Groovy脚本读取整个CSV文件并存入线程的List变量:
    // 替换成你的CSV文件路径
    def csvPath = "D:/test/input.csv"
    def csvFile = new File(csvPath)
    // 读取所有行,跳过表头(如果有表头的话)
    def allRows = csvFile.readLines().drop(1)
    // 把全量数据存入线程变量,供后续循环使用
    vars.putObject("allCsvData", allRows)
    
  • 添加循环控制器,循环次数设为动态获取的总行数:${__groovy(vars.getObject("allCsvData").size(),)}
  • 在循环控制器里添加JSR223 Sampler,提取当前循环对应的键值对:
    def allData = vars.getObject("allCsvData")
    // 获取当前循环的索引(JMeter自动生成的循环变量)
    def currentIdx = vars.get("__jm__Loop Controller__idx") as Integer
    // 分割当前行的键值对
    def keyValuePair = allData.get(currentIdx).split(",")
    // 存入变量供业务逻辑使用
    vars.put("currentKey", keyValuePair[0].trim())
    vars.put("currentValue", keyValuePair[1].trim())
    
  • 接下来就可以在你的校验逻辑里直接用${currentKey}和${currentValue}了
针对Ultimate Thread Group的额外提示

因为你用的是Ultimate Thread Group(支持自定义线程启动/停止节奏),要注意:

  • 如果用方案1,一定要把CSV的Sharing mode设为Current thread,避免多个线程抢读同一行数据
  • 如果用方案2,每个线程启动时都会执行预加载脚本,所以每个线程都会拿到完整的CSV数据,完全独立遍历,不会有冲突

内容的提问来源于stack exchange,提问作者Cod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:42:51