在真实的压测过程中,我们不可能是录制完脚本直接就设置虚拟用户进行压测,通常为了使压测结果更加真实,我们还需要做一些修改,其中就用到了逻辑控制器,下面具体来讲一下几种常用的逻辑控制器的使用。
Loop Controller(循环控制器)
使用场景:如果录制的一个脚本中,我只想对其中的一个或者几个请求进行循环操作,但是登录请求只想执行一次,那么应该怎么办?
添加循环控制器即Loop Controller:
在这里设置Controller里请求的循环次数:
这样我们在执行脚本的时候,该循环控制器下面的所有请求都会请求两遍,而登录操作只会执行一遍,执行结果如下:
While Controller(只要满足条件就一直执行)
使用场景:需要脚本一直执行,直到不满足某个条件(购买商品操作,一直循环购买,直到库存=1)。
只有当不满足Condition里的条件时,才会退出循环:
stock是参数化库存的值,且库存是一直变化的。
condition里我写得条件是${__javaScript(${amount} > 1)},就是stock>1时,执行循环,当stock的值大于<=1时,退出循环。具体设置如下图:
注意:我们的参数化的文件(CSV Data Set Config)要放在While Controller下面,不然取不到动态的值,会一直取参数化的第一条数据。
执行这个脚本时,当执行到库存=1时,不满足stock>1条件,所以执行完了当前循环,跳出While循环;也就是说不满足Condition的第一条数据会执行,即stock=1这次请求会执行完。
这里我们设置的初始库存是2,执行完第一次,库存减一,执行第二次时,库存是1不满足库存>1的条件,所以执行完当前循环后,跳出循环,一共执行两次加入购物车的请求。
If Controller 满足条件时只执行一次
使用场景:判断某个值符合条件时,执行请求,且只执行一次。
商品有库存时,执行加入购物车操作,无库存时,跳过该操作,继续往下执行(这里使用的场景跟While Controller一样,顺便讲一下两种Controller的不同)。这里也是引用的参数也是库存stock。
设置如下:
这里我们设置的Loop Controller(循环加入购物车)的循环次数是3。
If Controller的条件是${__groovy("${stock}" >= "1")}即当参数值>=1时,执行请求,如果<1,不执行请求。
这里注意,If Controller一定要与Loop Controller组合使用,不然If Controller只会执行一次。
这个时候我们执行脚本的时候,需要stock的值满足If Controller里的条件才会执行。
这里我们设置的初始化库存也是2,所以执行第三次的时候,发现第库存已经=0了,不满足执行该请求的条件,该次请求不执行,所以脚本只循环两次,执行结果如下:
同一个场景,既可以用While Controller也可以用If Controller,那么这两种的区别是什么呢?
循环次数不同。While Controller是只要满足条件就会一直执行。
而If Controller则是满足条件只会执行当前一次,如果要循环执行,则要在If Controller的上一级加一个Loop Controller来控制循环次数,不然只会执行一次。
While Controller不满足条件的第一条数据还是会执行,执行完了这条数据后,再跳出循环;而If Controller是只要数据不满足条件,当前请求就不执行。
Transation Controller
使用场景:需要统计多个请求的相应时间的总和。
如果前台一个操作,要请求后台的多个接口,那么就要把这一个操作的所有操作都放到一个Transation Controller里,可以统计出这一个Controller中总的响应时间,如下图:
Transaction Controller的作用就是统计多个请求的平均响应时间、最大最小响应时间、吞吐量等数据。
举个例子:一个前台查看产品详情的请求,他可能会请求多个接口,如获取商品尺码接口,获取商品颜色接口等等。
那么我们在看响应时间的时候,就不能看某一个接口的响应时间,而需要统计这一个请求调用的所有后台接口所用响应时间的总和,这个时候就需要用Transaction Controller来统计这一数据。
来看一下我们的执行结果:
我们可以看到Transation Controller作为一个独立的请求,统计了所有的请求的执行结果。
另外在设置控制器时有一个选项,如下图:
如果勾选了这个选项,那么Transation Controller里的响应时间就会包含Timer和前后处理器的时间,我们执行一下看一下,发现响应时间变长了。
Random Controller
使用场景:做压测时,我们不可能是所有的用户都做同样的操作,为了使结果更接近真实用户的场景,我们需要不同用户有不同的操作,这个时候我们就会用到Random Controller。
Random Controller:顾名思义,该Controller下的请求随机执行。
我们设置如下,我们在一个Random Controller下添加多个请求:
我们多次执行脚本发现,这三个请求是随机执行的,没有规律,就像真实场景中,不同用户也会有不同的操作。
那么如何让Random Controller自动执行多次呢?
可以在Random Controller的上一级加一个Loop Controller,设置循环次数。
这样我们就可以更加真实的模拟真实用户在使用系统时的各种情况,让压测结果更加接近真实数据。
作者:CICI