头像
淇迹时刻
-- : -- : --
切换主题色
-- : -- : --

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 Timer

2.2 配置

1名称: 固定定时器
2线程延迟(毫秒): 1000

2.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 Timer

3.2 配置

1名称: 高斯随机定时器
2偏差(毫秒): 500
3常量延迟(毫秒): 1000

3.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 Timer

4.2 配置

1名称: 均匀随机定时器
2随机延迟最大值(毫秒): 2000
3常量延迟(毫秒): 1000

4.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 Timer

5.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 Timer

6.2 配置

1名称: 同步定时器
2模拟用户组数量: 10
3超时时间(毫秒): 0

6.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 Timer

7.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 totalDelay

7.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 Timer

8.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:模拟用户真实操作流程

需求:模拟用户在电商网站的真实操作流程

配置步骤

  1. 创建线程组(50线程,循环5次)

  2. 添加高斯随机定时器(模拟用户思考时间):

1偏差: 500
2常量延迟: 1000
  1. 添加HTTP请求(访问首页):
1方法: GET
2路径: /
  1. 添加HTTP请求(浏览商品列表):
1方法: GET
2路径: /products
  1. 添加HTTP请求(查看商品详情):
1方法: GET
2路径: /products/${product_id}
  1. 添加HTTP请求(添加购物车):
1方法: POST
2路径: /cart/add
3参数:
4    product_id: ${product_id}
5    quantity: 1
  1. 添加HTTP请求(结算):
1方法: POST
2路径: /checkout
  1. 添加聚合报告

  2. 运行测试

10.2 案例2:控制请求速率测试

需求:测试接口在不同请求速率下的性能

配置步骤

  1. 创建线程组(100线程,循环Forever)

  2. 添加固定吞吐量定时器:

1目标吞吐量: 600(10样本/秒)
2计算基础: 所有活跃线程
  1. 添加HTTP请求(测试接口):
1方法: GET
2路径: /api/test
  1. 添加聚合报告

  2. 运行测试5分钟

  3. 修改吞吐量为1200(20样本/秒),重复测试

  4. 修改吞吐量为1800(30样本/秒),重复测试

  5. 比较不同速率下的性能指标

10.3 案例3:模拟高并发秒杀场景

需求:模拟电商秒杀场景,1000个用户同时抢购

配置步骤

  1. 创建线程组(1000线程,循环1次)

  2. 添加同步定时器:

1模拟用户组数量: 1000
2超时时间: 0
  1. 添加HTTP请求(秒杀接口):
1方法: POST
2路径: /api/seckill
3参数:
4    product_id: 1
5    user_id: ${__Random(1,1000000)}
  1. 添加聚合报告

  2. 运行测试

10.4 案例4:动态调整思考时间

需求:根据服务器响应时间动态调整用户思考时间

配置步骤

  1. 创建线程组(50线程,循环10次)

  2. 添加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
  1. 添加HTTP请求(测试接口):
1方法: GET
2路径: /api/test
  1. 添加聚合报告

  2. 运行测试

十一、常见问题

11.1 定时器不生效

回答

  • 检查定时器的作用域是否正确
  • 检查延迟时间是否设置正确
  • 检查采样器是否执行

11.2 吞吐量定时器无法达到目标

回答

  • 增加线程数
  • 检查服务器响应时间
  • 检查网络带宽
  • 确保目标吞吐量合理

11.3 同步定时器超时

回答

  • 增加超时时间
  • 确保线程数足够
  • 检查服务器响应时间

11.4 定时器影响性能

回答

  • 使用简单的定时器
  • 避免复杂的脚本计算
  • 根据测试需求选择合适的定时器

下一章14-分布式测试.md

最新文章

本页导航