jmeter中逻辑控制器(Logic Controllers)的作用域只对其子节点的sampler有效,作用是控制采样器的执行顺序。Jmeter的逻辑控制器有:事务控制器、循环控制器、仅一次控制器、IF控制器、吞吐量控制器、ForEach控制器、随机控制器、While控制器、Include控制器、Runtime控制器、临界部分控制器、交替控制器、录制控制器、简单控制器、随机顺序控制器、Switch控制器、模块控制器
jmeter提供了17种逻辑控制器,它们各个功能都不尽相同,大概可以分为2种使用类型:
1.控制测试计划执行过程中节点的逻辑执行顺序,如:Loop Controller(循环控制器)、If Controller(如果if控制器)等;
2.对测试计划中的脚本进行分组,方便JMeter统计执行结果以及进行脚本的运行时控制等,如:Throughput Controller(吞吐量控制器)、Transaction Controller(事务控制器)等
下面介绍几种常用的逻辑控制器
1、事务控制器
Jmeter会将每个请求默认当为一个事务,但是由于实际业务中,一个事务可能需要好几个请求组成,如转账的事务,需要转出的接口请求正确且转入的接口请求正确才算是事务成功,但凡其中有一个请求出错,转账的事务都不会成功。如果某个事务需要好几个请求组合完成,那么我们就可以拿事务控制器将这些请求包装起来。被包装起来的请求都是正确的,事务控制器才是正确的,其中任何一个请求出错了,事务控制器就出错。
2、简单控制器
简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可用来命名某些操作
这是Jmeter里最简单的一个控制器,它可以让我们组织归整我们的采样器和其它逻辑控制器(即:分组功能),提供一个块的结构和控制,不具有任何的逻辑控制和运行时的功能;
3、循环控制器
我们希望对某个取样器循环请求时,就可以使用到循环控制器,指定其子节点运行的次数,可以使用具体的数值,也可是设置为变量。
4、ForEach控制器
ForEach控制器一般和用户自定义变量或者正则表达式提取器一起使用,其在用户自定义变量或者从正则表达式提取器的返回结果中读取一系列相关的变量,该控制器下的采样器或者控制器都会被执行一次或多次,每次读取不同的变量值。
首先在控制器下面设置变量,我这里是设置了三个userid_1,userid_2,userid_3
然后设置控制器的相关信息
解释:
输入变量前缀:在其中输入需要遍历的用户参数。这里我输入的是userid,即会在用户定义的变量里面寻找以userid开头的变量名称
开始循环字段(不包含):循环指数开始(唯一)→ 遍历查询的变量范围,开始的值(这里如果不填写,默认从1开始,如果没有1开始的变量,执行时会报错)。这里填0,代表从1开始。
结束循环字段(包含):循环指数结束(包含)→ 遍历查询的变量范围,结束的值。这里填3, 代表以3结束。
输出变量名称:将遍历查询到的符合条件的用户参数赋值给输入变量(Vname),然后就可以在控制器下的取样器使用,格式为${输出变量名},这里我引用的输出变量名是uid。
Add”_”before number:输入变量名称中是否使用“_”进行间隔
以上流程,先在定义变量里面根据前缀userid获取我们需要的值,然后将其批量收集给到uid这个变量使用,实现轻量的参数化
5、仅一次控制器
用于控制某个请求在一次脚本执行下只执行一次
比如我在循环控制器下添加两个请求,其中一个请求用【仅一次控制器】包装起来,那么这个请求只会被执行一次,循环次数为3
6、while控制器
该控制器就类似于编程语言的while(Boolean boolean)循环控制,比较少用,了解即可。此处有三种情况:
1、什么都不填或者填true:那就相当于while(ture)死循环,请求会持续不断一致执行。
2、填flase:没有意义,永远不会执行被包裹的请求
3、填写具体的表达式,表达式同上面的IF控制器
如下我一直请求百度:
如下我借助jexl3函数助手填写表达式
由于上面的条件表达式永远都为true,所以也会一直不断执行请求
7、IF控制器
用于控制满足什么条件下,再去执行被包裹起来的请求。该控制器应用范围比较广泛,满足我们日常开发中想要某个请求满足什么条件才能执行的需求。比如:我们希望系统中的所有请求都需要成功登录后才能执行对应请求,希望某个请求需要前一个请求是正确的情况下才执行等需求。
解释:
1、Expression:表示我们填入的条件表达式
2、Interpret Condition as Variable Expression:如果勾选,则我们填写的Expression需要借助于__jexl3函数或者__groovy函数,如果不勾选,则直接填写我们的条件表达式即可
3、Evaluate for all children:将该控制器作用域所有子项的取样器,一般不勾选。
4、Use status of last sample:将执行该IF控制器前的最后一个取样器作为判断,如果是通过的就返回真,否则返回false
如下:借助__jexl3()函数完成表达式编写。先添加一个百度请求,添加后置处理器提取title变量:“百度一下,你就知道”,再添加一个被IF控制器包裹的请求,IF控制器填写表达式:如果${title}变量包含“百度”,则执行,不包含则跳过:
表达式:${__jexl3("${title}".contains("百度"),)},通过该IF控制器,就可以判断${title}变量是否包含“百度”关键字,如果包含则执行被包起来的请求,不包含则跳过,执行结果:
由于${title}包含了“百度”字符串,所以会执行被IF控制器包裹起来的“HTTP请求3”,如果表达式为false则不会执行