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或用户定义的变量,这些应放置在顶层(包括文件),否则无法正常工作;此元素不支持变量/函数在文件名字段中;但是,如果属于包含控制器定义的内容,则使用前缀路径名。

当使用包含控制器中包含相同的JMX文件,则要确保文件名不同,以避免无法读取;如果文件不能被发现,那么控制器会尝试打开文件名相对于JMX启动目录。

 

15、生命周期/运行周期控制器(Runtime Controller)

作用:用于控制该控制器下的取样器/控制器的运行时间

 

 Runtime(seconds):运行时间,单位为:秒

 

16、模块控制器(Module Controller)

作用:测试控制器子节点下的某一个模块,而不是整个测试计划

 

 寻找目标元素(Find target element):寻找测试计划中需要特定测试的元素,模块;也可理解为该控制器可以控制已经封装好的模块元素

△ :一个测试计划由一个控制器和所有的测试元素(取样器等)组成,测试计划可以位于任何线程组或工作台;如果计划位于线程组,则可以禁用其他控制器,防止正在运行的测试计划被影响(除了模块控制器)

     模块控制器的优势在于:当存在多个线程组时,该控制器可以轻松切换,只需要选择对应的取样器,方便快捷,替代了创建很多测试计划的繁琐操作

△ :任何一个模块所用的控制器名字必须唯一,因为其名字被用来找到目标控制器时重新加载;出于这个原因,最好保证控制器名字不同,否则执行测试时候可能发生意外

△ :模块控制器与远程测试不应使用或非gui测试与工作台部件,因为工作台测试元素并没有测试计划的一部分 jmx 文件。 任何这样的测试就会失败

 

17、录制控制器(Recording Controller)

作用:类似代理服务器的作用,在测试执行期间记录测试样本

 

 清除所有记录的样本(Clear all the recorded samples):点击可以清除所有已经记录的测试样本

一般情况下,在测试执行时候,它没有效果,但是在执行HTTPS测试脚本时,会记录下所有测试样本

 

 

posted @ 2019-10-09 16:24  爬虫上的雪碧  阅读(704)  评论(0编辑  收藏  举报