如何使用JMeter并行执行多组用户的API请求
无需拆分CSV实现多组用户并行执行API请求的方案
针对你不想维护大量拆分后CSV文件的需求,这里提供几个实用方案(以JMeter为例,你提到线程组,推测使用该工具):
方案1:CSV配置+If Controller条件过滤
- 保留原始500行的CSV文件,在CSV Data Set Config里配置好文件路径、变量名,关闭
Recycle on EOF,开启Stop thread on EOF。 - 给每个用户组对应创建一个If Controller,在条件里用线程编号过滤范围:
- Set1的条件:
${__jexl3(${__threadNum()} <= 100,)} - Set2的条件:
${__jexl3(${__threadNum()} > 100 && ${__threadNum()} <= 200,)} - 以此类推,每个If Controller下放置该组要执行的API请求逻辑。
- Set1的条件:
- 把线程组的线程数设为500,启动后每个线程对应CSV里的一行数据,只有符合条件的线程才会执行对应组的请求,天然实现并行。
方案2:Parallel Controller插件+CSV行范围配置
- 通过JMeter插件管理器安装Parallel Controller插件。
- 在Parallel Controller下创建对应数量的子线程组(比如Set1到Set4各一个),每个子线程组设置线程数为100。
- 给每个子线程组单独配置CSV Data Set Config,指定
Start row和End row:- Set1:起始行1,结束行100
- Set2:起始行101,结束行200
- 后续组依此类推,这样每个子线程组只会读取CSV里的指定行,不用拆分文件。
- Parallel Controller会自动让所有子线程组并行执行,完美匹配你的分组并行需求。
方案3:Groovy脚本+Switch Controller动态分组
- 在测试计划根节点添加JSR223 PreProcessor,用Groovy脚本根据线程编号给当前用户分配组:
def threadRow = ctx.getThreadNum() + 1 // 线程编号从0开始,加1对应CSV行号 if (threadRow <= 100) { vars.put("userGroup", "Set1") } else if (threadRow <= 200) { vars.put("userGroup", "Set2") } else if (threadRow <= 400) { vars.put("userGroup", "Set3") } else { vars.put("userGroup", "Set4") } - 添加Switch Controller,把
Switch Value设为${userGroup},然后在Controller下给每个组创建对应的请求分支。 - 线程组设500个线程,启动后每个线程会自动匹配到对应的组分支执行请求,实现并行。
这些方案都不需要拆分CSV,哪怕后续组数增加到20-30组,只要调整条件判断或脚本里的范围即可,维护成本极低。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

