性能测试工具 🔥Jmeter(十二) - 从入门到精通 - JMeter 逻辑控制器 - 终篇(详解教程)

北京-宏哥 · 2025年02月28日 · 408 次阅读

1.简介

Jmeter 官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”。

意思是说,逻辑控制器可以控制采样器 (samplers) 的执行顺序。由此可知,控制器需要和采样器一起使用,否则控制器就没有什么意义了。放在控制器下面的所有的采样器都会当做一个整体,执行时也会一起被执行。

JMeter 逻辑控制器可以对元件的执行逻辑进行控制,除仅一次控制器外,其他可以嵌套别的种类的逻辑控制器。

2.逻辑控制器分类

JMeter 中的 Logic Controller 分为两类:
(1)控制测试计划执行过程中节点的逻辑执行顺序,如:Loop Controller、If Controller 等;
(2)对测试计划中的脚本进行分组、方便 JMeter 统计执行结果以及进行脚本的运行时控制等,如:Throughput Controller、Transaction Controller。

3.预览逻辑控制器

首先我们来看一下 JMeter 的逻辑控制器,路径:线程组(用户)->添加->逻辑控制器(Logic Controller);我们可以清楚地看到 JMeter5 中共有 17 个逻辑控制器,如下图所示:

如果上图您看得不是很清楚的话,宏哥总结了一个思维导图,关于 JMeter5 的逻辑控制器类型,如下图所示:

通过以上的了解,我们对逻辑控制器有了一个大致的了解和认识。下面宏哥就给小伙伴或则童鞋们分享讲解一些通常在工作中会用到的逻辑控制器。

4.常用逻辑控制器详解

  这一小节,宏哥就由上而下地详细地讲解一下常用的逻辑控制器。

4.1Runtime Controller

运行控制器用来控制其子元件的执行时长。市场单位是秒。

1、我们先来看看这个 Runtime Controller 长得是啥样子,路径: 线程组 > 添加 > 逻辑控制器 > 运行控制器 ,如下图所示:

2、关键参数说明如下:

Name: 名称,可以随意设置,甚至为空;

Comments: 注释,可随意设置,可以为空;

Runtime: 默认为 1,去掉 1 则默认为 0,此时不执行其节点下的元件。 与线程组中的调度器的持续时间 效果一致。不填 或 0,不会执行样例

4.1.1Runtime 控制器控制其下取样器执行 2s

1、创建测试计划,设置 Runtime 控制器的运行时间 为 2,线程组设置默认不变,如下图所示:

Runtime 控制器设置

线程组设置

2、配置好以后,运行 JMeter,然后查看结果树,如下图所示:

4.1.2*使用线程组中的调度器控制样例运行 3s*

1、创建测试计划,设置 Runtime 控制器的运行时间 为 2,线程组设置运行时间 3,如下图所示:

线程组设置

Runtime 控制器设置

2、配置好以后,运行 JMeter,然后查看结果树,如下图所示:

线程组设置 3,Runtime 控制器设置 2,但是运行时间是 2s。所以从上边的运行时间得出结论:如果线程组中设置了持续时间,Runtime 控制器也设置了 运行时间,那么会优先于线程组中的设置。

4.2Simple Controller

Simple Controller 用来指定了一个执行单元,它不改变元件的执行顺序。在它下边还可以嵌套其他控制器。简单控制器可以编辑只有名称和注释。就像他的名字一样,简单,可以理解为一个文件夹,就是分组用的,没有其他特殊功能,但相比不添加简单控制器,区别在于简单控制器可以被模块控制器所引用。其作用就是分组,比如 QQ 好友列表,可分为家人、同学、等。一般是请求较多,需要分组时采用。

1、我们先来看看这个 Simple Controller 长得是啥样子,路径: 线程组 > 添加 > 逻辑控制器 > 简单控制器 ,如下图所示:

2、关键参数说明如下:

Name: 名称,可以随意设置,甚至为空;

Comments: 注释,可随意设置,可以为空。

4.2.1 简单实例

1、创建测试计划,线程组设置循环 10,如下图所示:

2、配置好以后,运行 JMeter,然后查看结果树,如下图所示:

4.3Throughput Controller

用来控制其下元件的执行次数,并无控制吞吐量的功能,想要控制吞吐量可以使用 Constant Throughput Timer,后边会讲解到。吞吐量控制器有两种模式:Total Executions:设置运行次数与 Percent Executions:设置运行比例 (1~100 之间)。

1、我们先来看看这个 Throughput Controller 长得是啥样子,路径: 线程组 > 添加 > 逻辑控制器 > 吞吐量控制器 ,如下图所示:

2、关键参数说明如下:

Name: 名称,可以随意设置,甚至为空;

Comments: 注释,可随意设置,可以为空;

Total Executions: 执行百分比(1-100);

percent Executions: 执行数量;

Throughput: 根据上边选择的方式填写,百分比为 0~100;

Per User: 线程数,当选 Total Executions 时,是线程数;当选 percent Executions 时,是线程数 * 循环次数。

4.3.1 不勾选 Per User

1、线程组中设置 线程数量 2,循环次数 10,吞吐量控制器 设置 Total Executions,吞吐量设置为 2,其下添加一个取样器,如下图所示:

2、配置好以后,运行 JMeter,然后查看结果树(执行了 2 次),如下图所示:

3、现在将 吞吐量控制器 设置为百分比的控制方式,吞吐量设置为:50%,如下图所示:

4、配置好以后,点击 “保存” 运行 JMeter,然后查看结果树(执行了 10 次,计算方式:10=吞吐量 50% * 循环次数 10 * 线程数 2),如下图所示:

4.3.2 勾选 Per User

1、线程组中设置 线程数量 2,循环次数 10,吞吐量控制器 设置 Total Executions,吞吐量设置为 2,其下添加一个取样器,勾选 Per User,如下图所示:

线程组设置

吞吐量控制器

2、配置好以后,点击 “保存”,运行 JMeter,然后查看结果树(总共执行了 4 次,其中吞吐量设置为 2,执行 2 次,线程设置为 2,执行 2 次,总共 4 次), 函数 __threadNum 只是简单地返回当前线程的编号, 如下图所示:

3、现在将 吞吐量控制器 设置为百分比的控制方式,吞吐量设置为:50,如下图所示:

4、配置好以后,点击 “保存” 运行 JMeter,然后查看结果树(执行了 10 次,计算方式:10=吞吐量 50% * 循环次数 10 * 线程数 2),如下图所示:

综上所述:

勾选 Per User:

1.线程数循环次数>=线程数吞吐量时,Total Executions 模式的执行次数=线程数 * 吞吐量。

2.线程数循环次数<线程数吞吐量时,Total Executions 模式的执行次数=当线程数 * 循环次数。

不勾选 Per User:

1.线程数循环次数<=吞吐量时,Total Executions 模式的执行次数=线程数循环次数。

2.线程数 * 循环次数>吞吐量时,Total Executions 模式的执行次数=吞吐量。

l Percent Executions:设置运行比例 (1~100 之间),单位为%

不管 Per User 是否勾选,按 Percent Executions 模式的执行次数都不受 Per User 影响,Percent Executions 模式的执行次数=线程数循环次数吞吐量%。(循环次数=线程组循环次数 * 循环控制器循环次数)

l Per User:勾选该项的话则按虚拟用户数(线程数)来计算执行次数,不勾选则按所有虚拟用户数来计算执行次数

测试计划 | 序号 | 线程数 | 循环次数 | 模式 | Throughput | Per User | 执行次数 |
| ---------------------------------------------------------------- | -------- | ---------- | ------ | ------------ | ---------- | ---------- |
| 1 | 2 | 10 | Percent | 50 | Y | 10 |
| 2 | 2 | 10 | Percent | 50 | N | 10 |
| 3 | 2 | 10 | Total | 7 | Y | 14 |
| 4 | 2 | 10 | Total | 7 | N | 7 |
| 5 | 2 | 2 | Total | 7 | Y | 4 |
| 6 | 2 | 2 | Total | 7 | N | 4 |

下面说明一下这 6 个场景:
(1)序号 1 和 2 场景,Per User 对总执行次数没有影响。
(2)序号 3 场景,Per User 勾选,每个虚拟用户(线程)执行 7 次,共执行 14 次。
(3)序号 4 场景,Per User 不勾选,则所有虚拟用户执行 7 次。
(4)序号 5 场景,Per User 勾选,每个虚拟用户(线程)执行 7 次,共执行 14 次,由于 Thread Group 计划循环次数是 4(2 线程 *2 循环)次,所以最多只能执行 4 次。
(5)序号 6 场景,Per User 不勾选,所有虚拟用户执行 7 次,由于 Thread Group 计划循环次数是 4(2 线程 *2 循环)次,所以最多只能执行 4 次。

4.4Module Controller

模块控制器可以快速的切换脚本,不用来回的新建,方便脚本调试。

可以理解为引用、调用的意思,执行内容为 Module To Run 种所选的内容,引用范围为当前测试计划内的测试片段、逻辑控制器<模块控制器除外>
被引用的逻辑控制器、测试片段可以为禁用状态,被引用后仍然会被执行。
可以将模块控制器与包括控制器一起学习比较,模块控制器是从内部文件中引用,引用上相对比较灵活,可以只引用部分测试片段或模块内容,包括控制器是从外部文件引用,只能引用整个测试片段的内容。
注意:被应用的模块位置不可随意变更,变更后会执行时出现提示引用失败
找到目标元素:快速查找与跳转的作用,点击后会立即跳转到所选的逻辑控制器的内容详情

1、我们先来看看这个 Module Controller 长得是啥样子,路径: 线程组 > 添加 > 逻辑控制器 > 模块控制器 ,如下图所示:

2、关键参数说明如下:

Name: 名称,可以随意设置,甚至为空;

Comments: 注释,可随意设置,可以为空;

Forever: 勾选上这一项表示一直循环下去。

4.4.1 实例

1、创建测试计划,添加两个测试片段,并且在每个测试片段下添加一个取样器,然后,添加线程组,再添加模块控制器,最后添加查看结果树,如下图所示:

2、配置模块控制器,选择第一个测试片段,如下图所示:

3、配置好以后,点击 “保存” 运行 JMeter,然后查看结果树(执行了第 1 个测试片段的取样器),如下图所示:

4、配置模块控制器,选择第二个测试片段,如下图所示:

5、配置好以后,点击 “保存” 运行 JMeter,然后查看结果树(执行了第 2 个测试片段的取样器),如下图所示:

4.5Switch Controller

Switch Controller:开关控制器,通过其下样例顺序数值或名称 控制执行某一个样例。

1、我们先来看看这个 if Controller 长得是啥样子,路径: 线程组 > 添加 > 逻辑控制器 > 如果 (if) 控制器 ,如下图所示:

2、关键参数说明如下:

Name: 名称,可以随意设置,甚至为空;

Comments: 注释,可随意设置,可以为空;

Switch Value: 指定请求的索引或者名称,索引从 0 开始,如果没有赋值,或者索引超过请求个数的话就执行第 0 个请求。可以是数字,也可以是字符,为字符时匹配取样器名称,如果匹配不上就会默认并找取样器名称为 default 的取样器,如果没有则不运行。

4.5.1 数值

数值:表示将执行其下第 数值 +1 个取样器,例如:填 1,将执行第 2 个取样器;填 0 或者不填,将执行第 1 个取样器;数值超出其下取样器数目时,执行第 1 个取样器。

1、创建一个测试计划,设置线程组和 Switch 控制器,如下图所示:

线程组

Switch 控制器

2、配置好以后,点击 “保存” 运行 JMeter,然后查看结果树(执行了第 3 <数值 +1> 个取样器),如下图所示:

3、修改 Switch 控制器的数值为 0 或者不填,如下图所示:

4、配置好以后,点击 “保存” 运行 JMeter,然后查看结果树(执行了第 1 <数值为 0 或者不填,执行第 1 个取样器> 个取样器),如下图所示:

4.5.2 字符

1、创建一个测试计划,设置线程组和 Switch 控制器(直接使用取样器名字),如下图所示:

线程组

Switch 控制器

2、配置好以后,点击 “保存” 运行 JMeter,然后查看结果树(执行了使用名字的取样器),如下图所示:

5.小结

好了,今天关于逻辑控制器的上篇就讲解到这里,这一篇主要介绍了 Runtime Controller 、 Simple Controller 、Throughput ControllerModule** Controller 和 ** Switch Controller

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册