JMeter多线程组复用CSV指定行及BeanShell处理器相关需求咨询
JMeter多线程组复用CSV指定行及BeanShell处理器相关需求咨询
嗨,针对你提出的两个JMeter需求,我给你整理了实操性很强的实现方案,不用再维护一堆CSV文件啦:
需求一:多线程组复用单个CSV指定行用户,生成Token后追加回CSV
1. 让每个线程组读取CSV指定范围的行
不用拆分多个CSV,单个文件就能搞定,步骤如下:
- 先确保你的CSV文件包含
username,password,token三列(token列可以先留空) - 给每个线程组添加User Defined Variables,定义两个变量:
startLine:当前线程组要读取的起始行号(比如线程组1设为1,线程组2设为6)endLine:当前线程组要读取的结束行号(比如线程组1设为5,线程组2设为8)
- 给每个线程组添加CSV Data Set Config,配置参数:
- Filename:填写你的CSV文件绝对路径(避免相对路径的坑)
- Variable Names:
username,password,token(和CSV列对应) - Delimiter:逗号(根据你的CSV实际分隔符调整)
- Recycle on EOF:False
- Stop thread on EOF:True
- Start thread at line:
${startLine} - End thread at line:
${endLine}
这样每个线程组的线程就只会读取你指定范围的CSV行啦。
2. 生成Token后追加回CSV对应行
在获取Token的API请求后面,添加一个JSR223 PostProcessor(推荐用Groovy,比BeanShell性能好),用以下代码把Token写入CSV对应行:
// 替换成你的CSV绝对路径 def csvPath = "C:/test/users.csv" def csvFile = new File(csvPath) // 获取当前线程读取的CSV行号(注意_currentLine是从0开始计数,要和你的起始行对应) def currentLine = vars.get("_currentLine") as int // 获取API返回的Token(假设你用正则提取器把Token存在了token变量里) def token = vars.get("token") // 读取CSV所有行,修改对应行的Token列 def lines = csvFile.readLines() def lineParts = lines[currentLine].split(",") lineParts[2] = token // 第三列是token,对应CSV的第三列 lines[currentLine] = lineParts.join(",") // 写回CSV文件 csvFile.write(lines.join("\n"))
注意:如果多个线程同时写文件,只要每个线程操作自己对应的行,就不会有并发冲突,因为每个线程对应CSV的一行。
需求二:根据响应头total_count和max_count变量动态控制循环次数
1. 先提取响应头里的total_count
在返回total_count的API请求后面,添加Response Header Extractor:
- Reference Name:
total_count - Header Name:填写响应头里total_count的实际名称(比如
X-Total-Count) - Match No:1
2. 用JSR223/BeanShell计算循环次数
推荐用JSR223 PreProcessor(比BeanShell更高效),放在Loop Controller前面,代码如下:
// 从变量中获取数值 int totalCount = Integer.parseInt(vars.get("total_count")) int maxCount = Integer.parseInt(vars.get("max_count")) // 假设你在User Defined Variables里定义了max_count=5000 // 按条件计算循环次数 int loopCount = totalCount < maxCount ? maxCount : totalCount // 把计算结果存到变量里 vars.put("loopCount", String.valueOf(loopCount))
如果一定要用BeanShell Processor,代码如下:
int totalCount = Integer.parseInt(vars.get("total_count")); int maxCount = Integer.parseInt(vars.get("max_count")); int loopCount; if (totalCount < maxCount) { loopCount = maxCount; } else { loopCount = totalCount; } vars.put("loopCount", String.valueOf(loopCount));
3. 配置Loop Controller
把Loop Controller的Loop Count设置为${loopCount},这样就会根据你设置的条件自动调整循环次数啦。
备注:内容来源于stack exchange,提问作者harshit gupta
相关产品推荐
相关产品推荐

