基于JMeter的API分块负载测试实现方案咨询
JMeter分块批量传数的配置实现
要实现「逐批传200条记录、批间固定间隔、不一次性全量发压」的效果,全程用JMeter内置组件就能搞定,不需要复杂二次开发,具体配置步骤:
1. 基础线程组配置
从根源上避免产生瞬时全量负载:
- 线程数设置为
1(单线程逐批发送,不会触发瞬时并发尖峰) - 循环次数按照「全量记录总数/200」计算出的总批次值填写,比如总共有10000条测试数据,就设置循环次数为50
- 线程启动时间设为
0,不需要做梯度启动,本身逐批发送的节奏就是平滑的
2. 分块数据读取逻辑
核心要实现每轮循环自动读取连续200条记录,作为单次接口调用的请求内容:
- 先把所有全量测试数据整理为结构化的CSV文件,每行对应1条记录,提前确认总记录数
- 添加
CSV Data Set Config组件,绑定上面的全量CSV文件,配置:- 变量名按数据列依次填写,比如
record_id,record_content - 文件编码选和实际文件匹配的格式,避免乱码
- 共享模式选择“当前线程组”
- 变量名按数据列依次填写,比如
- 添加
Counter(计数器)组件,放在HTTP请求采样器之前:- 启动值设为
0 - 递增数设为
200,刚好匹配每批的数据量 - 变量名设为
batchOffset - 作用是每轮循环自动累加偏移量,第一次循环偏移0、第二次偏移200、第三次偏移400,依次类推
- 启动值设为
- 添加
JSR223 PreProcessor(语言选Groovy,运行性能最好),写简单逻辑自动拼接每批的请求内容:- 提前把全量CSV的所有记录加载到内存的列表中
- 读取当前的
batchOffset值,截取出从这个位置开始的连续200条记录 - 按照接口要求的JSON或者表单格式拼好请求内容,存为JMeter变量
batchRequestBody
- 在HTTP请求的请求体配置栏,直接引用变量
${batchRequestBody}即可,不需要手动维护每批的内容
3. 批间间隔控制
在每轮HTTP请求执行完成后,加固定时长的暂停,匹配你需要的“间隔数秒再发下一批”的节奏:
- 添加
Flow Control Action采样器,放在HTTP请求的后面 - 动作选择“暂停当前线程”
- 暂停时长填写你需要的间隔对应的毫秒值,比如间隔3秒就填
3000 - 这个组件只暂停当前运行的发送线程,不会额外产生并发请求,完全符合逐批发压的节奏
注意事项
避坑提醒:绝对不要把线程数设置为总请求对应的并发数,否则会瞬间把所有请求打出去,完全违背分批发压的初衷。按照场景最初的设计,线程数固定设为1就行,后续要加负载再逐步调整。
- 配置完成后可以先跑1轮循环,用查看结果树确认请求体里的记录数是不是刚好200条、内容有没有错位、批间间隔是不是符合预期
- 如果后续要叠加负载,不需要调整分块逻辑,只需要把线程数从1调整到你需要的并发值即可——每个线程都会独立按照200条/批、固定间隔的节奏发送请求,不会产生瞬时流量尖峰
- 替代方案:如果不想写简单的Groovy拼接逻辑,也可以提前手动把全量数据按200条为一个块,拆成独立的JSON请求体文件,配合
CSV Data Set Config绑定所有拆分文件的路径,每轮循环引用一个文件作为请求体,效果完全一致,适合数据量极大、不想写脚本的场景
内容的提问来源于stack exchange,提问作者Shagun
相关产品推荐
相关产品推荐

