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.1Critical Section Controller
我们先来看一下,官方原汁原味的解释:The Critical Section Controller ensures that its children elements (samplers/controllers, etc.) will be executed by only one thread as a named lock will be taken before executing children of controller.
宏哥这个二把刀的翻译,给你们翻译一下这段鸟语看看到底是什么意思,大致意思是: Critical Section Controller(临界区控制器),确保它的子元素(samplers /控制器等)在执行控制器的子程序之前只执行一个线程作为指定的锁。呵呵!看到这句话是不是觉得一头雾水啊,摸一摸自己所剩无几的头发陷入沉思中.....没有关系的,不要纠结了,宏哥后边会用具体实例讲解一下,看完实例后,再回过头来阅读这句话,你就会恍然大悟了。
1、我们先来看看这个Critical Section Controller长得是啥样子,路径:线程组 > 添加 > 逻辑控制器 > 临界部分控制器,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Lock name:锁名称,这里可以填入其子节点下执行的线程的名称,这个线程作为一个全局锁存在
4.1.1实例讲解
这部分主要是通过配合实例我们来理解一下开始那句话到底什么意思。
1、宏哥这里先说一个访问宏哥博客园的JMeter系列文章的测试场景:我们第一步首先要访问博客园的首页,第二步找到宏哥的访问宏哥博客园的首页,第三步点击JMeter类别。按顺序完成三步,才能完成这个测试场景。那么我们根据这个场景用JMeter来添加多个请求的取样器。如下图所示:
2、脚本调试是通了,运行JMeter,查看结果树,如下图所示:
3、从上个图,查看结果树中显示请求结果数据不是按照顺序请求,不符合预期,这个时候增加一个critical section controller(临界部分控制器),增加一个锁,就能控制执行顺序。如下图所示:
4、脚本调试是通了,运行JMeter,查看结果树,可以清楚地看出来是按预期的顺序执行请求的。但是这样响应时间会过长,这个后边再做讲解。如下图所示:
4.1.2锁名分类
(1)锁名为空,认为每个锁为不同的锁
1、宏哥通过具体实例,来看一下,创建锁名为空的临界部分控制器,如下图所示:
2、运行JMeter,查看结果树,如下图所示:
(2)锁名相同,多个锁认为是同一个锁,同一个时间点只能存在一个运行中
1、宏哥通过具体实例,来看一下,创建锁名相同的临界部分控制器,如下图所示:
2、运行JMeter,查看结果树,如下图所示:
(3)锁名为变量,根据变量值来判断是不是属于同一个锁,变量值为相同时,则认为是同一个锁
1、宏哥通过具体实例,来看一下,创建锁名为变量的临界部分控制器,如下图所示:
2、运行JMeter,查看结果树,如下图所示:
4.2ForEach Controller
ForEach 控制器:一般搭配用户变量使用。依次调用用户定义的变量,直到最后一个,结束循环。为了满足ForEach Controller提取数据,变量命名的格式一般为“变量名_数字”,其中数字从1开始。
1、即遍历循环控制器,顾名思义是定义一个循环规则。
2、用来遍历当前元素的所有可执行场景。
3、在用户自定义变量中读取一系列相关的变量,该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。
4、这个控制器一般配合配置元件 → 正则表达式提取器来一起使用,可对页面上的某些元素进行重复处理。
1、我们先来看看这个ForEach Controller长得是啥样子,路径:线程组 > 添加 > 逻辑控制器 > ForEach控制器,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Input variable prefix:输入变量前缀,可以在“用户自定义变量”中定义一组变量,循环控制器可以从中获取到变量对应的值,然后作为循环控制器的循环条件,还可以输出变量作为取样器的参数。
Start index for loop:循环变量下标起点。循环指数开始(唯一)→ 遍历查询的变量范围,开始的值(这里如果不填写,默认从 1 开始,如果没有 1 开始的变量,执行时会报错)
End index for loop:循环变量下标终点。循环指数结束(包含)→ 遍历查询的变量范围,结束的值
Output variable name:输出变量名称,循环控制器生成的变量名称。后续可通过${}引用
Add "_" before number ?: 变量前缀后是否加“_”作为分隔符。如果定义的变量名中有下划线的话就要勾选此项,否则找不到;反之,没有的话不要勾选,否则同样找不到变量
4.2.1实例讲解
1、首先在自定义5个前缀为 北京宏哥 的变量,值分别为 a b c d e。并且 北京宏哥 后面的数字是连续的,如果不连续,则不会被循环到,如下图所示:
2、配置ForEach控制器,如下图所示:
3、添加请求 访问博客园首页 + 输出值:${宏哥},输出值是在控制器的输出变量 宏哥,通过 ${宏哥} 取到输出变量的值,如下图所示:
4、添加查看结果树,运行JMeter,查看结果树,如下图所示:
注意:敲黑板,敲脑袋!!!
1、输入变量的后缀数值一定要连续,比如 北京宏哥_1, 北京宏哥_2, 北京宏哥_3 ... 这样,如果中间有不连续的,循环会中断
2、循环开始的设定:如果变量为北京宏哥_1, 北京宏哥_2, 北京宏哥_3,而设定的开始为 1,则会从北京宏哥_2 开始循环
3、循环结束的设定:如果变量有3个 北京宏哥_1, 北京宏哥_2, 北京宏哥_3,而设定的结束为5,则只会循环 北京宏哥_1, 北京宏哥_2, 北京宏哥_3 ,如果设定的结束为2,则会循环 北京宏哥_1, 北京宏哥_2 。
4.3Include Controller
Include控制器用来导入外部的测试片段(非完整的测试计划),在执行时会执行导入的测试计划,但是被导入的测试计划有特殊要求,它不能有线程组,只能包含简单的控制器及控制器下的元件。换句话说就是相当于加了一个执行单元,一个封装了的业务操作单元,类似我们程序开发中的函数(方法)一样。例如一个查询学生信息的业务操作我们用取样器来模拟,然后放到简单控制器中作为一个执行单元,别的地方也要用到时,我们可以不用重复造轮子直接引用过来。
一般来说,Include控制器和测试片段(Test Fragment)配合使用的比较常见。
1、我们先来看看这个include Controller长得是啥样子,路径:线程组 > 添加 > 逻辑控制器 > Include控制器,如下图所示:
2、关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Filename:文件名,必输字段,如果没有,就会报错。通过Filename的路径和文件名引用外部的jmx文件。
宏哥推荐小伙伴或者童鞋们可以将 Include控制器 与 Module控制器(传送门)一起对比着学习,Include控制器 是从外部文件引用,只能引用整个测试片段的内容,Module控制器 是从内部文件中引用,引用上相对比较灵活,可以只引用部分测试片段或模块内容。这样一内一外不仅容易理解也容易记忆和学习。
4.3.1实例
(1)当Filename路径的值为空,程序执行报错,脚本执行中止,不会继续执行下面的脚本内容。
1、首先创建一个Filename路径为空的测试计划,如下图所示:
2、运行JMeter,查看结果树(程序执行报错,脚本执行中止,不会继续执行下面 访问博客园首页 的取样器),如下图所示:
(2)当Filename路径中的文件不存在,程序直接弹窗报错并停止执行。
1、首先创建一个Filename路径中的文件不存在的测试计划,点击“保存”按钮的时候,就会直接弹窗报错。如下图所示:
(3)当Filename路径的文件中不包含测试片段,跳过控制器,继续向下执行。
1、首先创建一个外部引用没有测试片段的测试计划,如下图所示:
2、创建一个Filename路径的文件中不包含测试片段的测试计划,将上边的外部引用-无测试片段文件添加到Include控制器中,如下图所示:
3、运行JMeter,查看结果树(跳过控制器,继续向下执行 访问博客园首页 的取样器),如下图所示:
(3)当Filename路径的文件中包含测试片段,执行完控制器,再继续向下执行。
1、首先创建一个外部引用有测试片段的测试计划,如下图所示:
2、创建一个Filename路径的文件中包含测试片段的测试计划,将上边的外部引用-有测试片段文件添加到Include控制器中,如下图所示:
3、运行JMeter,查看结果树(执行完控制器里的测试片段,再继续向下执行 访问博客园首页 的取样器),如下图所示:
到这里,大家应该理解了 Include Controller 和 Test Fragment 了吧。宏哥的理解就是,Test Fragment 相当于一个独立的部分,可以被其他测试计划引用,实现 样例的片段化,模块化,遇到重复需要的,比如登录、注册之类的,就可以用Test Fragment 和 Include Controller 了。这样可以避免重复造轮子,做许多无用功。
5.小结
好了,今天关于逻辑控制器的上篇就讲解到这里,这一篇主要介绍了 Critical Section Controller、ForEach Controller和Include控制器。
您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得随手点波 推荐 不要忘记哦!!!
别忘了点 推荐 留下您来过的痕迹