一、逻辑控制器简单介绍

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测试脚本时,会记录下所有测试样本

Jmeter学习笔记(十四)——逻辑控制器的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  3. JMeter学习(十四)JMeter函数学习(转载)

    转载自 http://www.cnblogs.com/yangxia-test JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值.一个函数的调用就像这样:${_functio ...

  4. JMeter学习笔记(四)

    1. 断言 断言组件是通过获取服务器响应数据,然后根据断言规则去匹配这些响应数据:匹配到是正常现象,此时我们看不到任何提醒,如果匹配不到,即出现了异常情况,此时JMeter就会断定这个事务失败,那么我 ...

  5. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

  6. JMeter学习(十四)JMeter监控Tomcat性能

    使用jmeter的tomcat监视器功能,可以通过向tomcat的status页面发送get请求,得到资源使用信息,然后转换为只直观的图像方式,这样的话,就可以监视到服务器的资源使用情况,不过需要注意 ...

  7. 【转】angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  8. angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  9. JMeter学习(十四)jmeter_断言使用

    先说一下使用断言的目的:在request的返回层面增加一层判断机制.因为request成功了,并不代表结果一定正确.类似于QTP中的检查点检查点.断言的使用方法: step_1:在你选择的Sample ...

  10. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

随机推荐

  1. [代码质量] Git统计本次提交新增代码行数,建议每个评审commit新增行数小于400行

    git log HEAD~1..HEAD --author="$(git config --get user.name)" --pretty=tformat: --numstat ...

  2. clipboard 在 vue 项目中,on 事件监听回调多次执行

    clipboard 定义一个全局变量 import ClipboardJS from "clipboard"; if(clipboard){ clipboard.destroy() ...

  3. [LeetCode] 637. Average of Levels in Binary Tree 二叉树的层平均值

    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...

  4. 【视频开发】ffmpeg 的编译选项

    ffmpeg xxxx$ ./configure --help Usage: configure [options] Options: [defaults in brackets after desc ...

  5. docker+k8s基础篇五

    Docker+K8s基础篇(五) service资源介绍 A:service资源的工作特性 service的使用 A:service字段介绍 B:ClusterIP的简单使用 C:NodePort的简 ...

  6. Float在内存中的存储方式及IEC61131处理

    Float在内存中的存储方式及IEC61131处理 1,fp32(32bits float)类型数据在存储器中占用4Bytes存储,且遵循IEEE-754标准: 一个浮点数分三部分组成: 符号位s(1 ...

  7. dubbo 使用、原理、接口请求,都经历了什么过程

    [dubbo官网文档]http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

  8. Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)

    一.url控制 基本路由写法:最常用 from django.conf.urls import url from django.contrib import admin from app01 impo ...

  9. python模块知识四 包和logging日志

    11.包 包:文件夹下具有__init__.py文件就是一个包,包用来管理多个模块 包的结构如下: bake ├── __init__.py ├── api ├── __init__.py ├── p ...

  10. Linux基础系统优化(一)

    前言 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig 查询.设置网卡和ip等参数 ifu ...