JMeter中的逻辑控制器决定了测试脚本的执行顺序和逻辑。下面我将详细解释几个最常用和最容易混淆的控制器的区别。
我们可以将它们分为几类来理解。
一、基础与核心控制器
1. 简单控制器
-
作用 :最简单的容器,不提供任何逻辑控制功能。
-
行为:它只是将内部的采样器(Samplers)和其他元素分组,使测试计划结构更清晰。
-
类比:就像文件夹,用来整理文件,但不会改变文件的执行顺序。
-
使用场景:纯粹为了代码组织和可读性。
2. 循环控制器
-
作用 :控制其子元件的执行次数。
-
行为:你设置一个"循环次数",它内部的所有采样器、断言等都会按这个次数重复执行。
-
使用场景:
-
模拟一个用户重复执行同一个操作(如多次查询、多次登录)。
-
在线程组循环次数的基础上,进行更细粒度的循环控制。
-
二、执行顺序控制器
3. 随机控制器
-
作用 :在每次执行时,随机选择其下的一个子元件来执行。
-
行为 :每次进入这个控制器,它都会从所有子项中随机挑一个执行,并且只执行这一个。
-
使用场景:模拟用户从多个可能操作中随机选择一个的场景(例如,随机点击一个商品链接)。
4. 随机顺序控制器
-
作用 :在每次循环中,以随机顺序执行其下的所有子元件。
-
行为 :每次进入这个控制器,它会将其所有子项的顺序打乱,然后全部执行一遍。
-
使用场景:模拟用户执行一系列操作,但每次的操作顺序都不固定。
随机 vs. 随机顺序 的核心区别:
-
随机控制器:N选1(只执行一个)。
-
随机顺序控制器:N个全执行,但顺序随机。
5. 交替控制器
-
作用 :在其每次循环时,按顺序选择其下的一个子元件来执行。
-
行为:假设它下面有3个采样器(A, B, C)。第一次进入控制器执行A,第二次进入执行B,第三次进入执行C,第四次又回到A,如此交替。
-
使用场景:模拟用户轮流执行不同操作的场景。
6. 切换控制器
-
作用 :通过索引或随机数来选择执行其下的一个子元件。
-
行为:
-
不填值:随机选择一个子项执行。
-
填数字N:执行第N个子项(从0开始计数)。
-
填变量名:用变量值作为索引。
-
-
使用场景:根据变量或固定规则,精确选择执行某一条路径。
三、模块化与流程控制控制器
7. 模块控制器
-
作用 :用于调用和复用"测试片段"中的控制器模块。
-
行为:它本身不包含任何逻辑,而是指向一个在"测试片段"中定义的控制器(如简单控制器、事务控制器),并执行该控制器下的所有内容。
-
使用场景:实现代码复用。将常用的操作流程(如登录、搜索)封装成"模块",在需要的地方通过模块控制器调用。
8. 包含控制器
-
作用 :从外部文件加载并执行一个测试计划片段。
-
行为 :在运行时,它会读取一个外部的
.jmx文件,并将其内容插入到当前位置执行。 -
使用场景:
-
团队协作:多人维护不同的脚本片段,最后由主脚本包含进来。
-
复用公共组件:如将header管理、登录逻辑写在外部文件中。
-
模块控制器 vs. 包含控制器:
-
模块控制器 :复用当前JMX文件内部的"测试片段"。
-
包含控制器 :复用外部另一个JMX文件的内容。
9. 事务控制器
-
作用 :将其下的所有采样器打包成一个"事务",并生成一个额外的结果来统计整个事务的响应时间。
-
行为:
-
Generate parent sample:如果勾选,在结果树和报告中,你只会看到这个事务控制器的结果,而不会看到其内部每个采样器的细节(更简洁)。
-
它会把从第一个子采样器开始到最后一个子采样器结束的总时间作为事务的响应时间。
-
-
使用场景:衡量一个完整业务流程的性能,例如"加入购物车"这个事务可能包含"添加商品"和"查看购物车"两个HTTP请求。
四、条件逻辑控制器
10. 如果(If)控制器
-
作用 :根据给定的条件决定是否执行其内部的元件。
-
行为:条件为真(True)时执行,为假(False)时不执行。条件可以是JavaScript或JMeter函数/变量表达式。
-
使用场景:实现条件分支逻辑,例如:只有登录成功后,才执行后续的敏感操作。
11. 一旦仅控制器
-
作用 :在每个线程的生命周期内,其内部的元件只执行一次。
-
行为:无论这个控制器被放在循环中还是哪里,每个线程(虚拟用户)只会执行它一次。
-
使用场景 :典型的应用是登录。你通常希望一个用户在整个测试过程中只登录一次,而不是在每次循环迭代时都登录。
12. While控制器
-
作用 :根据条件循环执行其内部的元件,直到条件为假。
-
行为:每次执行前检查条件,为真则继续执行。条件可以是:
-
空:直到其内部某个采样器失败才停止。
-
LAST:直到其内部某个采样器失败才停止(与空类似,但更明确)。 -
其他JMeter条件表达式。
-
-
使用场景:模拟需要一直执行直到满足某个条件的操作,例如翻页直到最后一页。
总结与选择指南
| 控制器名称 | 核心功能 | 典型应用场景 |
|---|---|---|
| 简单控制器 | 分组,无逻辑 | 代码整理 |
| 循环控制器 | 固定次数循环 | 重复操作 |
| 随机控制器 | 每次随机N选1 | 随机选择一个操作 |
| 随机顺序控制器 | 每次循环所有,但顺序随机 | 无序执行一系列操作 |
| 交替控制器 | 轮流执行子项 | 轮流执行不同操作 |
| 切换控制器 | 按索引/随机选择子项 | 根据规则选择执行路径 |
| 如果(If)控制器 | 条件判断 | 实现分支逻辑 |
| 一旦仅控制器 | 每个线程只执行一次 | 登录等初始化操作 |
| 事务控制器 | 将多个请求打包为一个事务 | 衡量业务流程性能 |
| 模块控制器 | 复用内部模块 | 代码内部复用 |
| 包含控制器 | 加载外部JMX片段 | 团队协作,外部代码复用 |
| While控制器 | 条件循环 | 直到满足条件才停止的操作 |
简单记忆:
-
要重复 ,用循环。
-
要随机 ,分清是随机一个(随机) 还是随机全部(随机顺序)。
-
要轮流 ,用交替。
-
要判断 ,用如果。
-
要打包 ,用事务。
-
要复用 ,内部用模块 ,外部用包含。
-
要只做一次 ,用一旦仅。
希望这个详细的解释能帮助你彻底理解它们的区别!J