--
:
--
:
--
JMeter定时器详解
最后更新于:
JMeter定时器详解
一、定时器概述
1.1 什么是定时器
定时器(Timers)是JMeter中控制采样器执行间隔的元件,用于模拟用户思考时间、控制请求频率等。
1.2 定时器的作用
- 模拟用户思考时间:模拟用户在操作之间的停顿
- 控制请求频率:控制请求发送的速率
- 实现同步:实现线程之间的同步
- 控制负载:控制服务器负载
1.3 定时器执行顺序
1定时器执行顺序:
21. 配置元件
32. 前置处理器
43. 定时器(按在测试计划树中的顺序)
54. 采样器
65. 后置处理器
76. 断言
87. 监听器1.4 定时器分类
| 类型 | 定时器名称 | 说明 |
|---|---|---|
| 固定定时器 | 固定定时器、高斯随机定时器 | 固定或随机延迟 |
| 吞吐量定时器 | 吞吐量定时器 | 控制请求速率 |
| 同步定时器 | 同步定时器 | 实现线程同步 |
| JSR223定时器 | JSR223定时器 | 使用脚本控制延迟 |
二、固定定时器
2.1 添加固定定时器
1右键点击线程组 → Add → Timer → Constant Timer2.2 配置
1名称: 固定定时器
2线程延迟(毫秒): 10002.3 参数说明
线程延迟(Thread Delay)
1线程延迟(毫秒): 1000说明:每个采样器执行前的固定延迟时间(毫秒)。
2.4 使用场景
模拟用户思考时间
1测试计划结构示例:
2测试计划
3├── 线程组(10线程,循环10次)
4│ ├── 固定定时器(1000毫秒)
5│ ├── HTTP请求(登录)
6│ ├── HTTP请求(浏览首页)
7│ └── HTTP请求(查看商品)效果:每个采样器执行前等待1秒,模拟用户操作间隔。
三、高斯随机定时器
3.1 添加高斯随机定时器
1右键点击线程组 → Add → Timer → Gaussian Random Timer3.2 配置
1名称: 高斯随机定时器
2偏差(毫秒): 500
3常量延迟(毫秒): 10003.3 参数说明
偏差(Deviation)
1偏差(毫秒): 500说明:随机延迟的标准差(毫秒)。
常量延迟(Constant Delay Offset)
1常量延迟(毫秒): 1000说明:固定延迟时间(毫秒)。
3.4 延迟计算
1总延迟 = 常量延迟 + 高斯随机数 * 偏差示例:
1常量延迟: 1000毫秒
2偏差: 500毫秒
3
4延迟范围: 1000 ± 3 * 500 = -500 ~ 2500毫秒
5实际延迟: 0 ~ 2500毫秒(负延迟取0)3.5 使用场景
模拟真实用户行为
1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环10次)
4│ ├── 高斯随机定时器
5│ │ 偏差: 500
6│ │ 常量延迟: 1000
7│ ├── HTTP请求(登录)
8│ ├── HTTP请求(浏览商品)
9│ ├── HTTP请求(添加购物车)
10│ └── HTTP请求(下单)效果:模拟用户操作间隔在0.5-2.5秒之间随机分布。
四、均匀随机定时器
4.1 添加均匀随机定时器
1右键点击线程组 → Add → Timer → Uniform Random Timer4.2 配置
1名称: 均匀随机定时器
2随机延迟最大值(毫秒): 2000
3常量延迟(毫秒): 10004.3 参数说明
随机延迟最大值(Maximum Random Delay)
1随机延迟最大值(毫秒): 2000说明:随机延迟的最大值(毫秒)。
常量延迟(Constant Delay Offset)
1常量延迟(毫秒): 1000说明:固定延迟时间(毫秒)。
4.4 延迟计算
1总延迟 = 常量延迟 + 随机数(0 ~ 随机延迟最大值)示例:
1常量延迟: 1000毫秒
2随机延迟最大值: 2000毫秒
3
4延迟范围: 1000 ~ 3000毫秒4.5 使用场景
模拟用户随机思考时间
1测试计划结构示例:
2测试计划
3├── 线程组(50线程,循环10次)
4│ ├── 均匀随机定时器
5│ │ 随机延迟最大值: 2000
6│ │ 常量延迟: 1000
7│ └── HTTP请求(浏览页面)五、吞吐量定时器
5.1 添加吞吐量定时器
1右键点击线程组 → Add → Timer → Constant Throughput Timer5.2 配置
1名称: 吞吐量定时器
2目标吞吐量(样本/分钟): 600
3计算吞吐量的基础: 所有活跃线程5.3 参数说明
目标吞吐量(Target throughput)
1目标吞吐量(样本/分钟): 600说明:每分钟执行的采样器数量。
计算:
1目标吞吐量(样本/秒)= 目标吞吐量(样本/分钟)/ 60
2600样本/分钟 = 10样本/秒计算吞吐量的基础(Calculate throughput based on)
1计算吞吐量的基础: 所有活跃线程选项:
- 所有活跃线程(All active threads):基于所有活跃线程计算
- 当前线程组的所有活跃线程(All active threads in current thread group):基于当前线程组计算
- 当前线程(Current thread):基于当前线程计算
5.4 使用场景
控制请求速率
1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环Forever)
4│ ├── 吞吐量定时器
5│ │ 目标吞吐量: 600(10样本/秒)
6│ │ 计算基础: 所有活跃线程
7│ └── HTTP请求(测试接口)效果:控制总体请求速率为10次/秒。
六、同步定时器
6.1 添加同步定时器
1右键点击线程组 → Add → Timer → Synchronizing Timer6.2 配置
1名称: 同步定时器
2模拟用户组数量: 10
3超时时间(毫秒): 06.3 参数说明
模拟用户组数量(Number of Simulated Users to Group By)
1模拟用户组数量: 10说明:每次同时释放的线程数量。
超时时间(Timeout in milliseconds)
1超时时间(毫秒): 0说明:等待线程的最大时间(毫秒)。0表示无限等待。
6.4 工作原理
11. 线程到达同步定时器时暂停
22. 当暂停的线程数达到"模拟用户组数量"时,同时释放所有线程
33. 如果等待时间超过"超时时间",释放已暂停的线程6.5 使用场景
模拟并发请求
1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环10次)
4│ ├── 同步定时器
5│ │ 模拟用户组数量: 10
6│ │ 超时时间: 0
7│ └── HTTP请求(秒杀接口)效果:每次10个线程同时请求秒杀接口。
七、JSR223定时器
7.1 添加JSR223定时器
1右键点击线程组 → Add → Timer → JSR223 Timer7.2 配置
1名称: JSR223定时器
2脚本语言: groovy
3脚本:
4 // 计算延迟时间
5 def baseDelay = 1000
6 def randomDelay = new Random().nextInt(2000)
7 def totalDelay = baseDelay + randomDelay
8
9 // 设置延迟
10 return totalDelay7.3 参数说明
脚本语言(Language)
1脚本语言: groovy选项:
- groovy(推荐):性能最好
- javascript:JavaScript语言
- beanshell:BeanShell语言
脚本(Script)
1// 脚本内容说明:要执行的脚本代码,返回延迟时间(毫秒)。
7.4 使用场景
动态延迟计算
1// 根据响应时间动态调整延迟
2def responseTime = prev?.getTime() ?: 0
3
4// 如果响应时间超过2秒,增加延迟
5if (responseTime > 2000) {
6 return 3000 + new Random().nextInt(2000)
7}
8
9// 正常延迟
10return 1000 + new Random().nextInt(1000)基于时间的延迟
1// 获取当前时间
2def hour = new Date().getHours()
3
4// 高峰期(9-12点,14-18点)使用较短延迟
5if ((hour >= 9 && hour <= 12) || (hour >= 14 && hour <= 18)) {
6 return 500 + new Random().nextInt(500)
7}
8
9// 非高峰期使用较长延迟
10return 2000 + new Random().nextInt(2000)八、固定吞吐量定时器
8.1 添加固定吞吐量定时器
1右键点击线程组 → Add → Timer → Constant Throughput Timer8.2 配置
1名称: 固定吞吐量定时器
2目标吞吐量(样本/分钟): 1200
3计算吞吐量的基础: 当前线程组的所有活跃线程8.3 参数说明
目标吞吐量(Target throughput)
1目标吞吐量(样本/分钟): 1200说明:每分钟执行的采样器数量。
计算吞吐量的基础(Calculate throughput based on)
1计算吞吐量的基础: 当前线程组的所有活跃线程选项:
- 所有活跃线程(All active threads):基于所有活跃线程计算
- 当前线程组的所有活跃线程(All active threads in current thread group):基于当前线程组计算
- 当前线程(Current thread):基于当前线程计算
8.4 使用场景
控制线程组的请求速率
1测试计划结构示例:
2测试计划
3├── 线程组(50线程,循环Forever)
4│ ├── 固定吞吐量定时器
5│ │ 目标吞吐量: 1200(20样本/秒)
6│ │ 计算基础: 当前线程组的所有活跃线程
7│ └── HTTP请求(测试接口)九、定时器作用域
9.1 采样器级别定时器
1添加位置: 采样器级别
2作用域: 仅该采样器9.2 控制器级别定时器
1添加位置: 控制器级别
2作用域: 控制器内所有采样器9.3 线程组级别定时器
1添加位置: 线程组级别
2作用域: 线程组内所有采样器9.4 测试计划级别定时器
1添加位置: 测试计划级别
2作用域: 所有线程组十、实战案例
10.1 案例1:模拟用户真实操作流程
需求:模拟用户在电商网站的真实操作流程
配置步骤:
创建线程组(50线程,循环5次)
添加高斯随机定时器(模拟用户思考时间):
1偏差: 500
2常量延迟: 1000- 添加HTTP请求(访问首页):
1方法: GET
2路径: /- 添加HTTP请求(浏览商品列表):
1方法: GET
2路径: /products- 添加HTTP请求(查看商品详情):
1方法: GET
2路径: /products/${product_id}- 添加HTTP请求(添加购物车):
1方法: POST
2路径: /cart/add
3参数:
4 product_id: ${product_id}
5 quantity: 1- 添加HTTP请求(结算):
1方法: POST
2路径: /checkout添加聚合报告
运行测试
10.2 案例2:控制请求速率测试
需求:测试接口在不同请求速率下的性能
配置步骤:
创建线程组(100线程,循环Forever)
添加固定吞吐量定时器:
1目标吞吐量: 600(10样本/秒)
2计算基础: 所有活跃线程- 添加HTTP请求(测试接口):
1方法: GET
2路径: /api/test添加聚合报告
运行测试5分钟
修改吞吐量为1200(20样本/秒),重复测试
修改吞吐量为1800(30样本/秒),重复测试
比较不同速率下的性能指标
10.3 案例3:模拟高并发秒杀场景
需求:模拟电商秒杀场景,1000个用户同时抢购
配置步骤:
创建线程组(1000线程,循环1次)
添加同步定时器:
1模拟用户组数量: 1000
2超时时间: 0- 添加HTTP请求(秒杀接口):
1方法: POST
2路径: /api/seckill
3参数:
4 product_id: 1
5 user_id: ${__Random(1,1000000)}添加聚合报告
运行测试
10.4 案例4:动态调整思考时间
需求:根据服务器响应时间动态调整用户思考时间
配置步骤:
创建线程组(50线程,循环10次)
添加JSR223定时器:
1// 获取前一个采样器的响应时间
2def responseTime = prev?.getTime() ?: 0
3
4// 根据响应时间动态调整延迟
5def delay = 1000 // 默认1秒
6
7if (responseTime > 3000) {
8 // 服务器响应慢,增加思考时间
9 delay = 3000 + new Random().nextInt(2000)
10} else if (responseTime > 1000) {
11 // 服务器响应一般,正常思考时间
12 delay = 1500 + new Random().nextInt(1000)
13} else {
14 // 服务器响应快,减少思考时间
15 delay = 500 + new Random().nextInt(500)
16}
17
18log.info("Response time: ${responseTime}ms, Delay: ${delay}ms")
19return delay- 添加HTTP请求(测试接口):
1方法: GET
2路径: /api/test添加聚合报告
运行测试
十一、常见问题
11.1 定时器不生效
回答:
- 检查定时器的作用域是否正确
- 检查延迟时间是否设置正确
- 检查采样器是否执行
11.2 吞吐量定时器无法达到目标
回答:
- 增加线程数
- 检查服务器响应时间
- 检查网络带宽
- 确保目标吞吐量合理
11.3 同步定时器超时
回答:
- 增加超时时间
- 确保线程数足够
- 检查服务器响应时间
11.4 定时器影响性能
回答:
- 使用简单的定时器
- 避免复杂的脚本计算
- 根据测试需求选择合适的定时器
下一章:14-分布式测试.md
📡
👤
作者:
阿海
🌐
版权:
本站文章除特别声明外,均采用
CC BY-NC-SA 4.0
协议,转载请注明来自
阿海 Blog!
- 01JMeter界面详解 2026-07-11
- 02性能测试学习路线 2026-07-11
- 03JMeter线程组配置详解 2026-07-11