如何在Ultimate Thread Group中分批读取CSV用户ID进行API压测?
我来帮你搞定这个分批读取CSV的需求,同时解决Beanshell的问题——其实完全不用写Beanshell脚本,用JMeter原生组件就能稳妥实现你的压测场景,还能避免脚本错误。
核心思路
把你的压测流程拆成两个独立的线程组,分别控制前1000个用户和接下来2000个用户的读取与调用,再通过线程组顺序执行+定时器实现停顿逻辑。
详细配置步骤
1. 调整Test Plan基础设置
首先在Test Plan界面勾选 Run thread groups consecutively(按顺序运行线程组),这样第一个线程组执行完成后才会启动第二个,保证压测顺序符合你的要求。
2. 配置第一个线程组(前1000个用户,1000用户/秒并发)
线程组参数:
- 线程数:
1000 - Ramp-Up时间:
1(1秒内启动所有线程,刚好达到1000用户/秒的并发) - 循环次数:
1(每个线程只调用一次API)
- 线程数:
CSV Data Set Config配置:
给这个线程组添加CSV配置,关键是限制读取的行数范围:文件名:你的用户ID.csv文件路径 变量名:userId 分隔符:根据你的CSV实际分隔符设置(比如逗号`,`) 忽略首行:勾选(如果CSV第一行是表头;没有表头就取消勾选) 起始行:2(如果有表头,数据从第2行开始;无表头则设为1) 结束行:1001(前1000个用户对应行:有表头时是2-1001,无表头是1-1000) 循环次数:1 共享模式:Current thread group(仅当前线程组共享CSV读取状态)添加停顿定时器:
在第一个线程组的最后添加一个 Random Timer,实现10-15秒的停顿:- 固定延迟:
10000(10秒) - 延迟范围:
5000(额外0-5秒随机延迟,总停顿10-15秒)
- 固定延迟:
3. 配置第二个线程组(接下来2000个用户)
线程组参数:
- 线程数:
2000 - Ramp-Up时间:
0(瞬间启动2000个用户;如果需要渐变并发,可设置对应时间,比如1秒就是2000用户/秒) - 循环次数:
1
- 线程数:
CSV Data Set Config配置:
同样添加CSV配置,调整起始和结束行,读取接下来的2000个用户:文件名:和第一个线程组相同的CSV路径 变量名:userId 分隔符:和之前一致 忽略首行:和之前一致 起始行:1002(有表头时,接第一个线程组的结束行;无表头则设为1001) 结束行:3001(1000+2000=3000个用户,有表头时对应2-3001,无表头是1-3000) 循环次数:1 共享模式:Current thread group
4. 配置API请求
在两个线程组里分别添加HTTP Request,设置API路径为 <path>/user_id/${userId},确保变量 ${userId} 能正确引用CSV里的用户ID。
为什么不用Beanshell?
你之前遇到的Beanshell错误,大概率是脚本里的IO操作、变量作用域或者语法问题导致的。JMeter的CSV Data Set Config已经内置了起始/结束行的控制能力,完全满足分批读取的需求,用原生组件更稳定、易维护,还能避免手写脚本的各种坑。
如果后续还要处理剩下的7000个用户,只需要继续添加线程组,调整CSV的起始/结束行参数即可,扩展性很强。
内容的提问来源于stack exchange,提问作者Ashu123

