如何在JMeter中实现指定时间内精准调用指定次数的API请求?
在JMeter中实现指定时间内精准调用API指定次数的方案
要在30分钟内精准调用API恰好20000次,仅靠线程数和响应时间配置容易因接口响应波动出现偏差,以下是两种可靠实现方式:
方法一:JSR223脚本精准控制请求间隔(推荐)
通过计算请求间隔时间,抵消接口响应波动的影响,确保总次数和总时间完全匹配:
- 线程组配置:
- 线程数设为
1 - 循环次数设为
20000 - 无需设置持续时间,脚本会自动控制总时长
- 线程数设为
- 添加JSR223 PreProcessor:将其放在API请求前,编写Groovy脚本:
// 总目标时长(毫秒,30分钟) def totalDuration = 30 * 60 * 1000 // 总请求次数 def totalRequests = 20000 // 当前循环次数(从1开始) def currentIter = vars.getIteration() // 计算每次请求的间隔(第一次请求无需等待) def interval = totalDuration / (totalRequests - 1) // 已消耗的时间 def elapsed = System.currentTimeMillis() - ctx.getThreadStartTime() // 计算需要等待的时长 def expectedTime = (currentIter - 1) * interval def waitTime = expectedTime - elapsed if (waitTime > 0) { sleep(waitTime) } - 多线程适配:如果单线程处理速度跟不上(接口响应时间超过计算出的间隔),可拆分线程数:
- 比如设2个线程,每个线程循环
10000次 - 脚本中
totalRequests改为10000,保持totalDuration不变,总次数仍为20000,总时长30分钟
- 比如设2个线程,每个线程循环
方法二:固定吞吐量定时器(Constant Throughput Timer)
适合对精度要求稍低的场景,配置更简单:
- 计算目标吞吐量:20000次 ÷ 1800秒 ≈ 11.11次/秒(或666.67次/分钟)
- 线程组配置:
- 设置足够多的线程数(建议20-30,避免线程不足导致达不到吞吐量)
- 循环次数设为
永远 - 持续时间设为
1800秒(30分钟)
- 添加Constant Throughput Timer:
- 吞吐量填写
666.67,单位选择分钟 - “Calculate throughput based on”选择
all active threads (shared),让所有线程共同维持目标吞吐量
- 吞吐量填写
注意事项
- 若接口响应时间波动极大,定时器方案可能出现±5%以内的偏差,此时优先选择JSR223脚本方案
- 测试前需确保JMeter所在机器性能足够,避免因资源瓶颈导致请求无法按时触发
内容的提问来源于stack exchange,提问作者Vsevolod Bulgartsev
相关产品推荐
相关产品推荐

