JMeter逻辑控制器详解
If Controller(条件判断控制器)
根据指定条件是否成立来决定是否执行其下的采样器。当条件为真时,执行所有子元素。
- 解释条件作为变量表达式:
- 未勾选:可直接写布尔表达式,如
count > 5,无需函数包装。 - 勾选:仅当表达式结果等于字符串true(忽略大小写)时才执行。 - 对所有子节点评估: 启用后,每次执行子元素前都会重新计算条件表达式。
JEXL3 函数使用说明
${__jexl3(${count} == "1", result)}
- 表达式参数: 要求执行的JEXL表达式。
- 结果变量名(可选): 可将计算结果保存为变量供后续引用。
注意事项:
- 若变量值为字符串类型,必须用双引号包裹,如
"${token}"。 - 数字类型可省略引号,但建议统一格式以避免错误。
- 支持与 Java 相同的比较和逻辑运算符。
其他表达式写法对比
- Groovy:
${__groovy(vars.get("count") == "1")} - JEXL3:
${__jexl3(${count} == "1")}或${__jexl3(${count} < 10)} - JavaScript:
${__javaScript("${count}" == "1")}
Transaction Controller(事务控制器)
用于测量一组请求的整体响应时间,生成一个代表整个事务耗时的样本。
- 包含计时器与前后处理器时间: 勾选后,将把计时器、前置/后置处理器的时间也计入总事务时间。通常不推荐启用,以免影响真实性能分析。
- 失败判定: 事务中任意一个采样器失败,整个事务即视为失败。
- 适用场景: 主要用于性能测试中的业务流程分析,接口测试中较少使用。
Once Only Controller(仅执行一次控制器)
在每个线程生命周期内仅执行一次其内部的采样器或逻辑控制器。
- 无论线程组循环多少次,该控制器内的内容只运行一次。
- 若上级存在
Loop Controller,仍只执行一次,不受其循环次数影响。 - 它只会停止最近一层的循环控制。
示例结构:
- 线程组
- Loop Controller (5 次)
- Loop Controller (2 次)
- Once Only Controller
- HTTP Request
此时,HTTP 请求将仅执行 5 次。
Loop Controller(循环控制器)
允许在当前线程中重复执行其下所有元素指定次数,独立于线程组的循环设置。
例如,在线程组设定循环 3 次的前提下,若嵌套了 Loop Controller 设置为 2 次,则实际执行共 6 次。
While Controller(while 条件循环控制器)
基于条件持续执行其子元素,直到条件变为假为止。
- 空值: 不输入任何内容,表示一直循环,直到某个请求失败。
- LAST: 仅在最后一次请求失败时退出循环。
- 其他值: 当条件表达式返回
false时退出。 - 可使用变量或函数作为条件来源,如
${__jexl3(${flag} == "true")}。
ForEach Controller(遍历控制器)
按数组形式遍历一组变量,常用于处理多个同名参数或批量数据。
- 依赖用户定义变量(UDV)或已存在的变量序列,如
user_1,user_2... - 变量命名必须从
_1开始,否则不会被识别。 - 若需自定义索引范围,可通过设置起始索引实现(如索引 0 表示从 _1 开始)。
- 实际行为是创建多个线程并行处理每一条数据,而非单线程循环。
Simple Controller(简单控制器)
仅用于组织测试计划结构,无任何执行逻辑功能。相当于一个容器,便于维护脚本层级关系。
Module Controller 与 Test Fragment(模块化设计)
通过 Test Fragment 和 Module Controller 实现测试组件的复用。
- Test Fragment: 与线程组同级,本身不会被执行,除非被模块控制器调用。
- 用途:
- 作为功能模块的临时存储区。
- 支持封装常用请求,供多个测试计划复用。
- 典型结构:
- Test Plan
- Test Fragment
- Login Request
- Data Setup
- Thread Group
- Module Controller (调用 Test Fragment 内容)
此方式极大提升了脚本可维护性与复用性。