Jmeter全方面讲解——Jmeter的元件使用介绍:(十)逻辑控制器详解

逻辑控制器有可能会打破Jmeter的执行顺序,Jmeter的逻辑控制器有:事务控制器、循环控制器、仅一次控制器、IF控制器、吞吐量控制器、ForEach控制器、随机控制器、While控制器、Include控制器、Runtime控制器、临界部分控制器、交替控制器、录制控制器、简单控制器、随机顺序控制器、Switch控制器、模块控制器。下面介绍几种控制器的使用。

一:事务控制器

Jmeter会将每个请求默认当为一个事务,但是由于实际业务中,一个事务可能需要好几个请求组成,如转账的事务,需要转出的接口请求正确且转入的接口请求正确才算是事务成功,但凡其中有一个请求出错,转账的事务都不会成功。如果某个事务需要好几个请求组合完成,那么我们就可以拿事务控制器将这些请求包装起来。被包装起来的请求都是正确的,事务控制器才是正确的,其中任何一个请求出错了,事务控制器就出错。

例子:事务控制器下添加了4个Http请求,每个请求都是对百度发起请求,只有每个请求都是通过的,事务控制器才会通过,否则事务控制器都是失败的。

(1)所有请求都正确的情况:

可以看到四个请求都是通过的情况下,事务控制器才是通过的

(2)事务控制器下存在有错误请求的情况:

可以看到只要其中有一个请求发生了错误,那么事务控制器也会错误。

 

二:循环控制器

我们希望对某个取样器循环请求时,就可以使用到循环控制器。

例子:

(1)为请求添加个循环控制器,循环次数填3

可以看到请求被循环请求了3次。

(2)为请求添加个循环控制器,循环次数选择永远,那么请求就会无休止地不断执行。

可以看到请求会持续不断地执行。

(3)配合线程属性设置,最终的循环次数为:线程数*循环次数*循环控制器次数,下面线程组设置3个线程,3次循环,为请求添加个循环控制器次数填3

可以看到总共执行了27次请求。

 

三:仅一次控制器

用于控制某个请求在一次脚本执行下只执行一次。

例子:在循环控制器下添加两个请求,其中一个请求用【仅一次控制器】包装起来,那么这个请求只会被执行一次。

可以看到被【仅一次控制器】包裹起来的“HTTP请求2”只被执行了一次。

 

四:IF控制器

用于控制满足什么条件下,再去执行被包裹起来的请求。该控制器应用范围比较广泛,满足我们日常开发中想要某个请求满足什么条件才能执行的需求。比如:我们希望系统中的所有请求都需要成功登录后才能执行对应请求,希望某个请求需要前一个请求是正确的情况下才执行等需求。

先来介绍下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

 

实例1:借助__jexl3()函数完成表达式编写。先添加一个百度请求,添加后置处理器提取title变量:“百度一下,你就知道”,再添加一个被IF控制器包裹的请求,IF控制器填写表达式:如果${title}变量包含“百度”,则执行,不包含则跳过:

表达式代码:${__jexl3("${title}".contains("百度"),)}

通过该IF控制器,就可以判断${title}变量是否包含“百度”关键字,如果包含则执行被包起来的请求,不包含则跳过,执行结果:

由于${title}包含了“百度”字符串,所以会执行被IF控制器包裹起来的“HTTP请求3”

下面将表达式结果改成false,如图:

由于${title}变量没有包含"百度222"字符串,所以被IF控制器包裹起来的“HTTP请求3”就不会执行,如图:

实例二:不借助于__jexl3()或__groovy()编写表达式,此种方式性能较低,所以我们一般都会借助于__jexl3()或__groovy()编写我们的表达式。

执行结果跟实例一一致,只是性能有所下降:

实例三:使用Use status of last sample:使用执行该IF控制器前的最后一个取样器结果作为判断,如果最后一个取样器通过就返回true,如果失败就返回false。

执行结果:由于前面的取样器是通过的,所以返回true,所以就会执行“HTTP请求3”:

 

五:while控制器

该控制器就类似于编程语言的while(Boolean boolean)循环控制,比较少用,了解即可。此处有三种情况:

1、什么都不填或者填true:那就相当于while(ture)死循环,请求会持续不断一致执行。

2、填flase:没有意义,永远不会执行被包裹的请求

3、填写具体的表达式,表达式同上面的IF控制器

实例1:表达式填写true

可以看到请求会持续不断执行。

 

实例2:借助jexl3函数助手填写表达式

由于上面的条件表达式永远都为true,所以也会一直不断执行:

 

六:吞吐量控制器

该控制器主要用于按照指定比例或者次数执行请求

有两个选项:1、Total Executions:设置请求执行指定次数,这里有几种情况

(1)如果设置的Total Executions次数<线程组设置的线程数*循环次数,那么就会运行此处Total Executions设置的次数

(2)如果设置的Total Executions次数>线程组设置的线程数*循环次数,那么会运行线程数*循环次数

2、Percent Executions:设置请求按照指定比例执行,这里有几种情况

(1)所有吞吐量控制器的比例加起来刚好等于100,则对应执行次数按照线程组*循环次数*Percent Executions次

(2)所有吞吐量控制器的比例加起来不等于100,则还是对应执行次数按照线程组*循环次数*Percent Executions次

(3)如果执行次数按照线程组*循环次数*Percent Executions为整数,则执行次数的请求,如果不为整数,则会向下取整

实例1:按照百分比执行对应请求,线程数设置为3,循环数设置为10,添加3个吞吐量控制器,分别设置的比例为15%,15%,70%

如图:

请求1的执行次数为:3*10*15%=4.5,此处不为整数,要向下取整4次

请求2的执行次数为:3*10*15%=4.5,此处不为整数,要向下取整4次

请求3的执行次数为:3*10*70%=21,此处为整数21,执行21次

执行结果如图:

 

实例2:按照执行指定次数设置,线程数设置为3,循环数设置为10,添加3个吞吐量控制器,分别设置的请求次数为10,30,40

请求1的吞吐量控制器次数:10<线程数(3)*循环数(10)=30次,所以会执行10次

请求2的吞吐量控制器次数:30=线程数(3)*循环数(10)=30次,所以会执行30次

请求3的吞吐量控制器次数:40>线程数(3)*循环数(10)=30次,所以只会执行30次

执行结果如下:

 

posted @ 2021-12-21 23:47  筱筱创  阅读(1321)  评论(0编辑  收藏  举报