如何让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)
- 如果行数固定,直接填数字就行;如果行数动态变化,可以用JMeter函数
- 把你的业务校验逻辑(比如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
相关产品推荐
相关产品推荐

