51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3115|回复: 0
打印 上一主题 下一主题

[原创] Jmeter之逻辑控制器(Controller)详解

[复制链接]
  • TA的每日心情
    擦汗
    昨天 08:46
  • 签到天数: 981 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-6-29 09:27:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     在真实的压测过程中,我们不可能是录制完脚本直接就设置虚拟用户进行压测,通常为了使压测结果更加真实,我们还需要做一些修改,其中就用到了逻辑控制器,下面具体来讲一下几种常用的逻辑控制器的使用。


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


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

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-7-9 07:12 , Processed in 0.059038 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表