zoukankan      html  css  js  c++  java
  • 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测试脚本时,会记录下所有测试样本

     

  • 相关阅读:
    easyui
    mvc
    Servlet简单计算器 2.0
    简易Servlet计算器1.0
    javaBean 练习—封装学生信息
    application和javaBean练习
    远程存储程序
    通讯录
    黑名单管理代码总结
    DAO
  • 原文地址:https://www.cnblogs.com/pachongshangdexuebi/p/11608882.html
Copyright © 2011-2022 走看看