Jmeter学习笔记(十四)——逻辑控制器
一、逻辑控制器简单介绍
Jmeter中逻辑控制器(Logic Controllers)的作用域只对其子节点的sampler有效,作用是控制采样器的执行顺序。放在逻辑控制器下面的所有的采样器都会当做一个整体,执行时也会一起被执行。
JMeter逻辑控制器有17种
JMeter中的Logic Controller分为两类:
1、控制测试计划执行过程中节点的逻辑执行顺序,如:Loop Controller(循环控制器)、If Controller(如果if控制器)等;
2、对测试计划中的脚本进行分组、方便JMeter统计执行结果以及进行脚本的运行时控制等,如:Controller(吞吐量控制器)、Transaction Controller(事务控制器)。
二、各种逻辑控制器详细介绍
1、简单控制器(Simple Controller)
作用:这是Jmeter里最简单的一个控制器,它可以让我们组织我们的采样器和其它的逻辑控制器(分组功能),提供一个块的结构和控制,并不具有任何的逻辑控制或运行时的功能。
2、仅一次控制器(Once Only Controller)
作用:在测试计划执行期间,该控制器下的子结点对每个线程只执行一次,登录场景经常会使用到这个控制器。
3、循环控制器(Loop Controller)
作用:指定其子节点运行的次数,可以使用具体的数值(如下图,设置为1次),也可以使用变量
1、永远(Forever)选项:勾选上这一项表示一直循环下去
2、如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘的结果。
注意:将Once Only Controller作为Loop Controller的子节点,Once Only Controller在每次循环的第一次迭代时均会被执行。
4、交替控制器(creatleave controller)
作用: 交替控制,使得该控制器包含的取样器步骤交错执行在每个循环中
忽略子控制器模块(Ignore sub-contorller blocks):如果勾选此项,交错控制器将sub-controllers像单一请求元素一样,一次只允许一个请求/控制器
使用方法:假使该控制器下有2个取样器A和B,交替执行A和B2个请求,即每次传递一个子请求到这个测试,按子元件的排列顺序
实例1:
线程组的循环次数为5次,有一个交替控制器,下面有11、22两个sample
执行结果:
实例2:
线程组循环次数设置为5次,交替控制器下嵌套一个循环控制器,循环次数3;交替控制器设置不忽略子控制器
执行结果:
实例3:
线程组循环次数设置为5次,交替控制器下嵌套一个循环控制器,循环次数3;交替控制器设置为忽略子控制器
执行结果:
5、随机控制器(Random Controller)
作用:类似交替控制器,但该控制器随机选取某一个取样器请求并执行
忽略子控制器模块(Ignore sub-controller blocks):如果勾选此项,交错控制器将sub-controllers像单一请求元素一样,一次只允许一个请求/控制器
实例1:
线程组的循环次数为5次,有一个随机控制器,下面有11、22两个sample
执行结果:
实例2:
线程组循环次数设置为5次,随机控制器下嵌套一个循环控制器,循环次数3;随机控制器设置不忽略子控制器
执行结果:
实例3:
线程组循环次数设置为5次,随机控制器下嵌套一个循环控制器,循环次数3;随机控制器设置为忽略子控制器
执行结果:
6、随机顺序控制器(Random Order Controller)
作用:类似于简单控制器,将执行每个子节点下的取样器请求一次,但是执行是随机的
实例:
线程组循环次数设置为5次,随机顺序控制器下面有11、22sample
执行结果:
7、吞吐量控制器(throughput controller)
作用:控制其下的子节点的执行次数与负载比例分配,也有两种方式:
- Total Executions:设置运行次数
- Percent Executions:设置运行比例(1~100之间)
吞吐量(Throughput):对应上面的执行数量或者比例
每个用户(Per User):每个用户
如果勾选此项,将导致控制器计算是否应该执行在每个用户(每个线程)的基础上;如果不加以控制,那么将计算全球所有用户
实例:
(1)线程组设置的循环次数为5次
(2)该吞吐量控制器设置的是总执行数为3
(3)该吞吐量控制器设置的是40%执行率,即(40% * 线程组循环次数5)= 2次
(4)执行结果:11执行了3次,22执行了2次
8、IF控制器(If Controller)
作用:根据给定表达式的值决定是否执行该节点下的子节点
- Expression(must evaluate true or false)输入框:此处需要写入需要进行判断的表达式,从must evaluate true or false可知,实际使用时,只能填入true或者false这样的值,因此我们需要借助其他模块或者函数将需要进行判断的表达式(如 ${var}== 5)转换成true或false,判断才能生效,直接将${var}== 5这样的表达式写入Expression中是无效的。从该控制器提示的信息中,可以借助__jexl3或者__groovy函数来计算表达式的值。
- Interpret Condition as Variable Expression?:
不勾选:直接输入我们需要判断的表达式即可,判断表达式为真时,执行if控制器下的请求,例如“1!=2”,则一定会执行下面的http请求
勾选:这时expression中不能直接填写条件表达式,需要借助函数将条件表达式计算为true/false,可以借助的函数有_jexl3和_groovy,例如:直接填写${modelId}==5,是不能识别的。
表达式支持:
== 是否等于,如${__jexl3(${VAR}==1,)},判断${VAR}变量是否等于1
!= 不等于,如${__jexl3(${VAR}!=1,)},判断${VAR}变量是否不等于1
! 非,如${__jexl3(!(${VAR}!=1),)}对${VAR}!=1的结果取反
&&或|| 且与或,如 ${__jexl3(${VAR}==1 && ${name} != "heima",)}
> 或者>== 大于等于,如${__jexl3(${count}>=10,)}
- Evaluate for all children:如果选中这一项,在每个子结点执行前都会计算表达式
实例1:
不勾选Interpret Condition as Variable Expression?
直接写表达式,表达式为true,执行下面的11sample。
实例2:
勾选Interpret Condition as Variable Expression?
不能直接写表达式,需要转化为_jexl3和_groovy函数。
我们可是使用jmeter的函数助手:
(1)打开函数助手对话框
(2)选择jexl3或者_groovy,输入表达式,点击生成,这个时候会生成对应的函数表达式
(3)复制结果到条件中:
9、事务控制器(transaction controller)
这个控制器在在业务控制上并没有什么特殊逻辑,可以理解为在简单控制器的基础上添加了统计的功能,当所有子节点全部成功则成功,由任意一个失败结果就为失败。
事务控制器不会对其子节点的执行逻辑产生影响,其效果为在监听器生成统计的时,以一个单独的统计点来统计,可各项指标为控制器子节点的指标之和。
当事务控制器下的任意一子节点执行失败,事务控制器的执行结果就会被以失败统计。
参数:
Generate parent sample:如果事务控制器下有多个取样器,勾选它,那么在“察看结果树”中我事务控制器以父节点存在,下面取样器作为子节点,并且事务控制器定义的事务是否成功取决于子事务是否都成功,子事务其中任何一个失败即代表整个事务失败。
Include duration of timer and pre-post processors in generated sample:是否包括定时器、预处理和后期处理延迟的时间
实例:
事物控制器下面有取样器11、22,勾选Generate parent sample
执行结果:
10、当/判断控制器(While Controller)
作用:运行其子节点下的取样器/控制器,直到条件为“假”
Condition(function or variable):条件(函数或变量):里面可填入判断依据的条件,参照
使用方法:可能的条件值有:
①.空白:最后一个示例循环失败时退出循环
②.LAST :当 While 控制器下最后一个样例执行失败后 跳出循环,如果 While 控制器 前一个样例执行失败,则不会进入While循环,也就是不会执行While控制器下的样例。
③.自定义条件:值为True 或 False的函数/变量/属性 表达式
实例1:空白
执行结果:执行到最后 一个示例22时失败,退出了循环
实例2:LAST
如果只是循环里面的22执行失败,执行结果和空白的时候一样,跳出循环:
但是如果控制器前一个取样器44执行错误,将不会进入循环:
实例3:自定义变量
比如一个简单的例子,定义一个变量test,它的值为true
执行结果:
那么while里面的取样器一直循环执行。
11、转换控制器(Switch Controller)
作用:通过给该控制器中的value赋值,来指定运行哪个取样器(也可以理解为开关控制器)
Switch value:控制器具体赋值的value值字段
有两种赋值方式:
①.第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪个元素。
②.第二种是直接指定子元素的名称,比如采样器的Name来进行匹配。当指定的名称不存在时,不执行任何元素。
当Value为空时,默认执行第1个子节点元素。
实例1:
设置为1,那么执行的就是1+1的test2取样器
实例2:
设置为取样器的名称test1,那么执行的就是test1取样器
12、临界区控制器(critical section Controller)
作用:临界区控制器确保它的子元素(samplers /控制器等)在执行控制器的子程序之前只执行一个线程作为指定的锁。根据锁名来控制并发,同一个锁名之下,在同一时间点只能存在一个运行中,适用于控制并发的场景。
名称和注释很简单,就是给控制器添加一个备注,使人明白这个控制器的解释含义的意思
Lock name:锁名称,这里可以填入其子节点下执行的线程的名称,这个线程作为一个全局锁存在
锁名类型:
锁名为空,认为每个锁为不同的锁
锁名相同,多个锁认为是同一个锁,同一个时间点只能存在一个运行中
锁名为变量,根据变量值来判断是不是属于同一个锁,变量值为相同时,则认为是同一个锁
演示脚本: Demo_临界部分控制器
13、遍历循环控制器(ForEach Controller)
作用:用来遍历当前元素的所有可执行场景;在用户自定义变量中读取一系列相关的变量,该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值;
输入变量前缀:在其中输入需要遍历的用户参数(User Parameter)
Start index for loop(exclusive):循环指数开始(唯一)→ 遍历查询的变量范围,开始的值(这里如果不填写,默认从1开始,如果没有1开始的变量,执行时会报错)
End index for loop(inclusive):循环指数结束(包含)→ 遍历查询的变量范围,结束的值
输出变量名称:将遍历查询到的符合条件的用户参数赋值给输入变量(Vname),然后就可以在控制器下的取样器使用,格式为${输出变量名}
Add”_”before number:输入变量名称中是否使用“_”进行间隔
PS:这个控制器一般配合配置元件→ 正则表达式提取器来一起使用,可对页面上的某些元素进行重复处理。
14、包含控制器(Include Controller)
作用:用于引用外部的Jmx文件;从而控制多个测试计划组合
include Test Plan:包含测试计划的文件名,可以点击浏览,从文件夹保存的JMX文件夹目录下选择对应的JMX文件
使用方法:创建一个测试计划,下面可添加取样器/控制器等,然后保存测试计划,为了方便起见, 线程组也可以添加外部JMX文件中用于调试;
如果测试使用Cookie或用户定义的变量,这些应放置在顶层(包括文件),否则无法正常工作;此元素不支持变量/函数在文件名字段中;但是,如果属于包含控制器定义的内容,则使用前缀路径名。
15、生命周期/运行周期控制器(Runtime Controller)
作用:用于控制该控制器下的取样器/控制器的运行时间
Runtime(seconds):运行时间,单位为:秒
16、模块控制器(Module Controller)
作用:测试控制器子节点下的某一个模块,而不是整个测试计划
寻找目标元素(Find target element):寻找测试计划中需要特定测试的元素,模块;也可理解为该控制器可以控制已经封装好的模块元素
△ :一个测试计划由一个控制器和所有的测试元素(取样器等)组成,测试计划可以位于任何线程组或工作台;如果计划位于线程组,则可以禁用其他控制器,防止正在运行的测试计划被影响(除了模块控制器)
模块控制器的优势在于:当存在多个线程组时,该控制器可以轻松切换,只需要选择对应的取样器,方便快捷,替代了创建很多测试计划的繁琐操作
△ :任何一个模块所用的控制器名字必须唯一,因为其名字被用来找到目标控制器时重新加载;出于这个原因,最好保证控制器名字不同,否则执行测试时候可能发生意外
△ :模块控制器与远程测试不应使用或非gui测试与工作台部件,因为工作台测试元素并没有测试计划的一部分 jmx 文件。 任何这样的测试就会失败
17、录制控制器(Recording Controller)
作用:类似代理服务器的作用,在测试执行期间记录测试样本
清除所有记录的样本(Clear all the recorded samples):点击可以清除所有已经记录的测试样本
一般情况下,在测试执行时候,它没有效果,但是在执行HTTPS测试脚本时,会记录下所有测试样本