--
:
--
:
--
JMeter控制器详解
最后更新于:
JMeter控制器详解
一、控制器概述
1.1 什么是控制器
控制器(Controllers)是JMeter中控制测试执行流程的元件,用于组织和控制采样器的执行顺序和条件。
1.2 控制器的作用
- 组织测试逻辑:将相关的采样器分组
- 控制执行顺序:定义采样器的执行顺序
- 条件执行:根据条件决定是否执行某些采样器
- 循环执行:重复执行某些采样器
- 随机执行:随机选择执行某些采样器
1.3 控制器分类
| 类型 | 控制器名称 | 说明 |
|---|---|---|
| 逻辑控制器 | 简单控制器、循环控制器、条件控制器等 | 控制执行流程 |
| 采样控制器 | 事务控制器 | 将多个采样器组合为一个事务 |
二、简单控制器
2.1 添加简单控制器
1右键点击线程组 → Add → Logic Controller → Simple Controller2.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 Controller3.2 配置
1名称: 循环10次
2循环次数: 103.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 Controller4.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 Controller5.2 配置
1名称: 随机选择接口
2随机种子: 123455.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 Controller6.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 Controller7.2 配置
1名称: 用户登录事务
2生成父样本: true
3包含定时器和处理器: true7.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 Controller8.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 Controller9.2 配置
1名称: 按比例分配请求
2吞吐量: 50
3计算方式: Total Executions9.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 Controller10.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:模拟复杂用户行为
需求:模拟用户登录后随机执行不同操作
配置步骤:
创建线程组(100线程,循环10次)
添加仅一次控制器:
1名称: 用户登录- 添加HTTP请求(登录接口)
- 添加JSON提取器(提取Token)
- 添加HTTP信息头管理器:
1名称: Authorization
2值: Bearer ${token}- 添加随机控制器:
1名称: 随机操作- 添加HTTP请求(浏览首页)
- 添加HTTP请求(搜索商品)
- 添加HTTP请求(查看商品详情)
- 添加HTTP请求(查看购物车)
- 添加HTTP请求(下单购买)
添加查看结果树和聚合报告
运行测试
11.2 案例2:事务性能测试
需求:测试用户下单的完整事务性能
配置步骤:
创建线程组(200线程,循环5次)
添加事务控制器:
1名称: 下单事务
2生成父样本: true- 添加HTTP请求(查看商品)
- 添加HTTP请求(添加购物车)
- 添加HTTP请求(提交订单)
- 添加HTTP请求(支付订单)
添加聚合报告
运行测试
分析事务响应时间
11.3 案例3:条件分支测试
需求:根据用户等级执行不同的测试逻辑
配置步骤:
创建线程组(100线程,循环1次)
添加HTTP请求(获取用户等级)
添加JSON提取器(提取用户等级):
1引用名称: user_level
2JSON路径表达式: $.data.level- 添加If控制器(普通用户):
1条件: ${__jexl3("${user_level}" == "normal",)}- 添加HTTP请求(普通用户接口)
- 添加If控制器(VIP用户):
1条件: ${__jexl3("${user_level}" == "vip",)}- 添加HTTP请求(VIP用户接口)
- 添加If控制器(管理员):
1条件: ${__jexl3("${user_level}" == "admin",)}- 添加HTTP请求(管理员接口)
添加查看结果树
运行测试
十二、常见问题
12.1 控制器执行顺序问题
回答:控制器按照在测试计划树中的顺序从上到下执行。
12.2 如何实现循环次数依赖于变量
回答:使用JEXL表达式:
1${__jexl3(${loop_count},)}12.3 如何实现条件判断
回答:使用If控制器,支持JEXL和JavaScript表达式。
12.4 事务控制器不生成父样本
回答:确保勾选了"生成父样本"选项。
下一章:05-断言详解.md
📡
👤
作者:
阿海
🌐
版权:
本站文章除特别声明外,均采用
CC BY-NC-SA 4.0
协议,转载请注明来自
阿海 Blog!
- 01JMeter界面详解 2026-07-11
- 02性能测试学习路线 2026-07-11
- 03JMeter线程组配置详解 2026-07-11