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

发表于:2021-6-28 09:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:CICI    来源:51Testing软件测试网原创

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

  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,设置循环次数。

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

      版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号