lsekfe 发表于 2021-6-29 09:27:38

Jmeter之逻辑控制器(Controller)详解

 在真实的压测过程中,我们不可能是录制完脚本直接就设置虚拟用户进行压测,通常为了使压测结果更加真实,我们还需要做一些修改,其中就用到了逻辑控制器,下面具体来讲一下几种常用的逻辑控制器的使用。


  Loop Controller(循环控制器)
  使用场景:如果录制的一个脚本中,我只想对其中的一个或者几个请求进行循环操作,但是登录请求只想执行一次,那么应该怎么办?
  添加循环控制器即Loop Controller:
http://www.51testing.com/attachments/2021/06/15326825_2021062511003019lcF.png

  在这里设置Controller里请求的循环次数:
http://www.51testing.com/attachments/2021/06/15326825_202106251100302bIcm.png

  这样我们在执行脚本的时候,该循环控制器下面的所有请求都会请求两遍,而登录操作只会执行一遍,执行结果如下:
http://www.51testing.com/attachments/2021/06/15326825_202106251100303IQIo.png

  While Controller(只要满足条件就一直执行)
  使用场景:需要脚本一直执行,直到不满足某个条件(购买商品操作,一直循环购买,直到库存=1)。
  只有当不满足Condition里的条件时,才会退出循环:
http://www.51testing.com/attachments/2021/06/15326825_202106251100304q4wl.png

  stock是参数化库存的值,且库存是一直变化的。
  condition里我写得条件是${__javaScript(${amount} > 1)},就是stock>1时,执行循环,当stock的值大于<=1时,退出循环。具体设置如下图:
http://www.51testing.com/attachments/2021/06/15326825_202106251100305sEqJ.png

  注意:我们的参数化的文件(CSV Data Set Config)要放在While Controller下面,不然取不到动态的值,会一直取参数化的第一条数据。
  执行这个脚本时,当执行到库存=1时,不满足stock>1条件,所以执行完了当前循环,跳出While循环;也就是说不满足Condition的第一条数据会执行,即stock=1这次请求会执行完。
  这里我们设置的初始库存是2,执行完第一次,库存减一,执行第二次时,库存是1不满足库存>1的条件,所以执行完当前循环后,跳出循环,一共执行两次加入购物车的请求。
http://www.51testing.com/attachments/2021/06/15326825_2021062511003067uIM.png

  If Controller 满足条件时只执行一次
  使用场景:判断某个值符合条件时,执行请求,且只执行一次。
  商品有库存时,执行加入购物车操作,无库存时,跳过该操作,继续往下执行(这里使用的场景跟While Controller一样,顺便讲一下两种Controller的不同)。这里也是引用的参数也是库存stock。
  设置如下:
http://www.51testing.com/attachments/2021/06/15326825_202106251100307vFEk.png

  这里我们设置的Loop Controller(循环加入购物车)的循环次数是3。
  If Controller的条件是${__groovy("${stock}" >= "1")}即当参数值>=1时,执行请求,如果<1,不执行请求。
  这里注意,If Controller一定要与Loop Controller组合使用,不然If Controller只会执行一次。
http://www.51testing.com/attachments/2021/06/15326825_202106251100308F1do.png

  这个时候我们执行脚本的时候,需要stock的值满足If Controller里的条件才会执行。
  这里我们设置的初始化库存也是2,所以执行第三次的时候,发现第库存已经=0了,不满足执行该请求的条件,该次请求不执行,所以脚本只循环两次,执行结果如下:
http://www.51testing.com/attachments/2021/06/15326825_202106251100309FCA0.png

  同一个场景,既可以用While Controller也可以用If Controller,那么这两种的区别是什么呢?
  循环次数不同。While Controller是只要满足条件就会一直执行。
  而If Controller则是满足条件只会执行当前一次,如果要循环执行,则要在If Controller的上一级加一个Loop Controller来控制循环次数,不然只会执行一次。
  While Controller不满足条件的第一条数据还是会执行,执行完了这条数据后,再跳出循环;而If Controller是只要数据不满足条件,当前请求就不执行。


  Transation Controller
  使用场景:需要统计多个请求的相应时间的总和。
  如果前台一个操作,要请求后台的多个接口,那么就要把这一个操作的所有操作都放到一个Transation Controller里,可以统计出这一个Controller中总的响应时间,如下图:
http://www.51testing.com/attachments/2021/06/15326825_2021062511003010lvxL.png

  Transaction Controller的作用就是统计多个请求的平均响应时间、最大最小响应时间、吞吐量等数据。
  举个例子:一个前台查看产品详情的请求,他可能会请求多个接口,如获取商品尺码接口,获取商品颜色接口等等。
  那么我们在看响应时间的时候,就不能看某一个接口的响应时间,而需要统计这一个请求调用的所有后台接口所用响应时间的总和,这个时候就需要用Transaction Controller来统计这一数据。
  来看一下我们的执行结果:
http://www.51testing.com/attachments/2021/06/15326825_2021062511003011MFXX.png

  我们可以看到Transation Controller作为一个独立的请求,统计了所有的请求的执行结果。
  另外在设置控制器时有一个选项,如下图:
http://www.51testing.com/attachments/2021/06/15326825_202106251102101aeSb.png

  如果勾选了这个选项,那么Transation Controller里的响应时间就会包含Timer和前后处理器的时间,我们执行一下看一下,发现响应时间变长了。
http://www.51testing.com/attachments/2021/06/15326825_202106251102102Ectf.png

  Random Controller
  使用场景:做压测时,我们不可能是所有的用户都做同样的操作,为了使结果更接近真实用户的场景,我们需要不同用户有不同的操作,这个时候我们就会用到Random Controller。
  Random Controller:顾名思义,该Controller下的请求随机执行。
  我们设置如下,我们在一个Random Controller下添加多个请求:
http://www.51testing.com/attachments/2021/06/15326825_2021062511021035juy.png

  我们多次执行脚本发现,这三个请求是随机执行的,没有规律,就像真实场景中,不同用户也会有不同的操作。
http://www.51testing.com/attachments/2021/06/15326825_202106251102104Xbl5.png

  那么如何让Random Controller自动执行多次呢?
  可以在Random Controller的上一级加一个Loop Controller,设置循环次数。
http://www.51testing.com/attachments/2021/06/15326825_202106251102105eiUu.png

  这样我们就可以更加真实的模拟真实用户在使用系统时的各种情况,让压测结果更加接近真实数据。

页: [1]
查看完整版本: Jmeter之逻辑控制器(Controller)详解