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

JMeter控制器详解

最后更新于:

JMeter控制器详解

一、控制器概述

1.1 什么是控制器

控制器(Controllers)是JMeter中控制测试执行流程的元件,用于组织和控制采样器的执行顺序和条件。

1.2 控制器的作用

  • 组织测试逻辑:将相关的采样器分组
  • 控制执行顺序:定义采样器的执行顺序
  • 条件执行:根据条件决定是否执行某些采样器
  • 循环执行:重复执行某些采样器
  • 随机执行:随机选择执行某些采样器

1.3 控制器分类

类型控制器名称说明
逻辑控制器简单控制器、循环控制器、条件控制器等控制执行流程
采样控制器事务控制器将多个采样器组合为一个事务

二、简单控制器

2.1 添加简单控制器

1右键点击线程组 → Add → Logic Controller → Simple Controller

2.2 配置

1名称: 用户管理模块
2注释: 包含用户相关的所有接口测试

2.3 作用

  • 组织测试逻辑:将相关的采样器分组到一个逻辑单元中
  • 不改变执行顺序:简单控制器不会改变其下元件的执行顺序
  • 便于管理:使测试计划结构更清晰

2.4 使用场景

 1测试计划结构示例:
 2测试计划
 3├── 线程组
 4│   ├── 简单控制器 - 用户管理模块
 5│   │   ├── HTTP请求 - 创建用户
 6│   │   ├── HTTP请求 - 获取用户列表
 7│   │   ├── HTTP请求 - 更新用户
 8│   │   └── HTTP请求 - 删除用户
 9│   ├── 简单控制器 - 订单管理模块
10│   │   ├── HTTP请求 - 创建订单
11│   │   ├── HTTP请求 - 获取订单列表
12│   │   └── HTTP请求 - 取消订单
13│   └── 简单控制器 - 商品管理模块
14│       ├── HTTP请求 - 获取商品列表
15│       └── HTTP请求 - 搜索商品

三、循环控制器

3.1 添加循环控制器

1右键点击线程组 → Add → Logic Controller → Loop Controller

3.2 配置

1名称: 循环10次
2循环次数: 10

3.3 参数说明

循环次数(Loop Count)

1循环次数: 10

选项

  • 具体数值:循环指定次数
  • Forever:无限循环

条件(Condition)

1条件: ${__jexl3(${count} < 5,)}

说明:使用JEXL表达式设置循环条件。

3.4 执行逻辑

1循环控制器执行流程:
21. 进入循环控制器
32. 检查循环次数或条件
43. 如果满足条件,执行子元件
54. 循环次数减1或重新检查条件
65. 重复步骤2-4直到条件不满足
76. 退出循环控制器

3.5 使用场景

1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环1次)
4│   ├── 循环控制器(循环10次)
5│   │   ├── HTTP请求 - 浏览商品
6│   │   └── HTTP请求 - 添加购物车
7│   └── HTTP请求 - 下单购买

效果:每个用户浏览商品并添加购物车10次,然后下单购买。

四、条件控制器

4.1 添加条件控制器

1右键点击线程组 → Add → Logic Controller → If Controller

4.2 配置

1名称: 根据响应判断
2条件: ${__jexl3(${response_code} == 200,)}

4.3 参数说明

条件(Condition)

1条件: ${__jexl3(${response_code} == 200,)}

支持的表达式

  • JEXL表达式(推荐):${__jexl3(条件,)}
  • JavaScript表达式${__javaScript(条件,)}
  • 简单条件:直接使用变量和运算符

解释条件(Interpret Condition as Variable Expression?)

1勾选: 解释条件为变量表达式

说明:如果勾选,JMeter会将条件作为变量表达式解释。

评估所有子条件(Evaluate for all children)

1勾选: 评估所有子条件

说明:如果勾选,每个子元件都会检查条件。

4.4 常用条件表达式

响应码判断

1${__jexl3(${response_code} == 200,)}
2${__jexl3(${response_code} != 500,)}

响应时间判断

1${__jexl3(${response_time} < 1000,)}
2${__jexl3(${response_time} > 500,)}

变量值判断

1${__jexl3(${user_id} > 0,)}
2${__jexl3("${username}" == "admin",)}
3${__jexl3(${status} == "active",)}

逻辑运算

1${__jexl3(${response_code} == 200 && ${response_time} < 1000,)}
2${__jexl3(${response_code} == 200 || ${response_code} == 201,)}
3${__jexl3(!(${response_code} == 500),)}

4.5 使用场景

1测试计划结构示例:
2测试计划
3├── 线程组
4│   ├── HTTP请求 - 登录
5│   ├── If Controller(${__jexl3(${response_code} == 200,)})
6│   │   ├── HTTP请求 - 访问首页
7│   │   └── HTTP请求 - 查看个人信息
8│   └── If Controller(${__jexl3(${response_code} != 200,)})
9│       └── HTTP请求 - 记录登录失败

五、随机控制器

5.1 添加随机控制器

1右键点击线程组 → Add → Logic Controller → Random Controller

5.2 配置

1名称: 随机选择接口
2随机种子: 12345

5.3 参数说明

随机种子(Random Seed)

1随机种子: 12345

说明:设置随机数种子,相同种子会产生相同的随机序列。

作用

  • 便于测试结果的可重复性
  • 用于调试和问题复现

5.4 执行逻辑

1随机控制器执行流程:
21. 进入随机控制器
32. 随机选择一个子元件
43. 执行选中的子元件
54. 退出随机控制器

5.5 使用场景

1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环10次)
4│   ├── 随机控制器
5│   │   ├── HTTP请求 - 浏览首页
6│   │   ├── HTTP请求 - 搜索商品
7│   │   ├── HTTP请求 - 查看商品详情
8│   │   └── HTTP请求 - 查看购物车

效果:每个用户随机执行一个操作。

六、随机顺序控制器

6.1 添加随机顺序控制器

1右键点击线程组 → Add → Logic Controller → Random Order Controller

6.2 配置

1名称: 随机顺序执行

6.3 执行逻辑

1随机顺序控制器执行流程:
21. 进入随机顺序控制器
32. 随机打乱子元件的顺序
43. 按打乱后的顺序执行所有子元件
54. 退出随机顺序控制器

6.4 使用场景

1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环1次)
4│   ├── 随机顺序控制器
5│   │   ├── HTTP请求 - 步骤1
6│   │   ├── HTTP请求 - 步骤2
7│   │   ├── HTTP请求 - 步骤3
8│   │   └── HTTP请求 - 步骤4

效果:所有步骤都会执行,但顺序随机。

七、事务控制器

7.1 添加事务控制器

1右键点击线程组 → Add → Logic Controller → Transaction Controller

7.2 配置

1名称: 用户登录事务
2生成父样本: true
3包含定时器和处理器: true

7.3 参数说明

生成父样本(Generate parent sample)

1勾选: 生成父样本

说明:如果勾选,JMeter会生成一个父样本,包含所有子样本的汇总信息。

包含定时器和处理器(Include duration of timer and pre-post processors in generated sample?)

1勾选: 包含定时器和处理器

说明:如果勾选,事务时间会包含定时器和处理器的时间。

7.4 执行逻辑

1事务控制器执行流程:
21. 进入事务控制器
32. 开始计时
43. 执行所有子元件
54. 结束计时
65. 生成事务样本(如果勾选生成父样本)
76. 退出事务控制器

7.5 使用场景

 1测试计划结构示例:
 2测试计划
 3├── 线程组(100线程,循环10次)
 4│   ├── 事务控制器 - 用户登录
 5│   │   ├── HTTP请求 - 访问登录页
 6│   │   ├── HTTP请求 - 提交登录表单
 7│   │   └── HTTP请求 - 跳转首页
 8│   └── 事务控制器 - 商品购买
 9│       ├── HTTP请求 - 查看商品
10│       ├── HTTP请求 - 添加购物车
11│       └── HTTP请求 - 提交订单

效果:统计整个事务的响应时间。

7.6 事务控制器 vs 简单控制器

特性事务控制器简单控制器
生成父样本支持不支持
统计事务时间支持不支持
组织测试逻辑支持支持
改变执行顺序不改变不改变

八、仅一次控制器

8.1 添加仅一次控制器

1右键点击线程组 → Add → Logic Controller → Once Only Controller

8.2 配置

1名称: 初始化操作

8.3 执行逻辑

1仅一次控制器执行流程:
21. 线程组启动时执行一次
32. 之后不再执行

8.4 使用场景

1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环10次)
4│   ├── 仅一次控制器
5│   │   ├── HTTP请求 - 登录获取Token
6│   │   └── HTTP请求 - 获取用户信息
7│   └── 循环控制器(循环10次)
8│       └── HTTP请求 - 访问业务接口

效果:每个用户只登录一次,然后多次访问业务接口。

九、吞吐量控制器

9.1 添加吞吐量控制器

1右键点击线程组 → Add → Logic Controller → Throughput Controller

9.2 配置

1名称: 按比例分配请求
2吞吐量: 50
3计算方式: Total Executions

9.3 参数说明

吞吐量(Throughput)

1吞吐量: 50

说明:设置吞吐量值,含义取决于计算方式。

计算方式(Calculate Throughput based on)

1计算方式: Total Executions

选项

  • Total Executions:总执行次数占比
  • Percent Executions:执行百分比
  • Per Minute:每分钟执行次数
  • Per Second:每秒执行次数

9.4 使用场景

1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环10次)
4│   ├── 吞吐量控制器(50%, Percent Executions)
5│   │   └── HTTP请求 - 浏览首页
6│   └── 吞吐量控制器(50%, Percent Executions)
7│       └── HTTP请求 - 搜索商品

效果:50%的请求浏览首页,50%的请求搜索商品。

十、时间控制器

10.1 添加时间控制器

1右键点击线程组 → Add → Logic Controller → Runtime Controller

10.2 配置

1名称: 运行30秒
2运行时长: 30(秒)

10.3 参数说明

运行时长(Runtime (seconds))

1运行时长: 30

说明:设置控制器的运行时长(秒)。

10.4 使用场景

1测试计划结构示例:
2测试计划
3├── 线程组(100线程,循环Forever)
4│   ├── 时间控制器(30秒)
5│   │   └── HTTP请求 - 持续访问接口

效果:持续访问接口30秒。

十一、实战案例

11.1 案例1:模拟复杂用户行为

需求:模拟用户登录后随机执行不同操作

配置步骤

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

  2. 添加仅一次控制器:

1名称: 用户登录
  • 添加HTTP请求(登录接口)
  • 添加JSON提取器(提取Token)
  1. 添加HTTP信息头管理器:
1名称: Authorization
2值: Bearer ${token}
  1. 添加随机控制器:
1名称: 随机操作
  • 添加HTTP请求(浏览首页)
  • 添加HTTP请求(搜索商品)
  • 添加HTTP请求(查看商品详情)
  • 添加HTTP请求(查看购物车)
  • 添加HTTP请求(下单购买)
  1. 添加查看结果树和聚合报告

  2. 运行测试

11.2 案例2:事务性能测试

需求:测试用户下单的完整事务性能

配置步骤

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

  2. 添加事务控制器:

1名称: 下单事务
2生成父样本: true
  • 添加HTTP请求(查看商品)
  • 添加HTTP请求(添加购物车)
  • 添加HTTP请求(提交订单)
  • 添加HTTP请求(支付订单)
  1. 添加聚合报告

  2. 运行测试

  3. 分析事务响应时间

11.3 案例3:条件分支测试

需求:根据用户等级执行不同的测试逻辑

配置步骤

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

  2. 添加HTTP请求(获取用户等级)

  3. 添加JSON提取器(提取用户等级):

1引用名称: user_level
2JSON路径表达式: $.data.level
  1. 添加If控制器(普通用户):
1条件: ${__jexl3("${user_level}" == "normal",)}
  • 添加HTTP请求(普通用户接口)
  1. 添加If控制器(VIP用户):
1条件: ${__jexl3("${user_level}" == "vip",)}
  • 添加HTTP请求(VIP用户接口)
  1. 添加If控制器(管理员):
1条件: ${__jexl3("${user_level}" == "admin",)}
  • 添加HTTP请求(管理员接口)
  1. 添加查看结果树

  2. 运行测试

十二、常见问题

12.1 控制器执行顺序问题

回答:控制器按照在测试计划树中的顺序从上到下执行。

12.2 如何实现循环次数依赖于变量

回答:使用JEXL表达式:

1${__jexl3(${loop_count},)}

12.3 如何实现条件判断

回答:使用If控制器,支持JEXL和JavaScript表达式。

12.4 事务控制器不生成父样本

回答:确保勾选了"生成父样本"选项。


下一章05-断言详解.md

最新文章

本页导航