侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 67 篇文章
  • 累计创建 25 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

JMeter -- 逻辑控制器

一朵云
2022-02-14 / 0 评论 / 2 点赞 / 8475 阅读 / 16592 字

前言:

  之前的博客 “JMeter – 事务” 中已介绍过的JMeter事务控制器之外,它还有若干控制逻辑的元件,将在下面篇幅中逐一列举说明。

  JMeter逻辑控制器可以对元件的执行逻辑进行控制,除了一次控制器外,其他控制器下都可以嵌套别的种类的逻辑控制器。

image.png

补充:

JMeter执行顺序如下:

  • 1、配置元件
  • 2、前置处理器
  • 3、定时器
  • 4、采样器
  • 5、后置处理器(除非服务器响应为空)
  • 6、断言(除非服务器响应为空)
  • 7、监听器(除非服务器响应为空)

  新手通常会以为Jmeter是按排列顺序执行的,这种错误的理解在使用逻辑控制器时会被放大,从而错以为是逻辑控制器的效果,这个因为Jmeter基础不扎实而导致的坑要切记,不然后面写复杂结构是要吃大亏。

逻辑控制器:

1、ForEach 循环控制器(ForEach Controller)

image.png

示例演示:

场景:

  通过循环遍历 “用户定义的变量” (用户名集合),并将姓名作为入参进行接口请求。

image.png

image.png

image.png

效果总览:

循环控制器示例结果.gif

2、简单控制器(Simple Controller)

  简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可用来命名某些操作,主要用来组合取样器和其他逻辑控制器。

image.png

3、包含控制器(Include Controller)

  用于引用外部的Jmx文件(测试片段),被导入的Jmx文件不能有线程组,只能包含简单控制器及控制器下的元件。简而言之,相当于封装了一个业务操作单元来调用,类似程序开发中的函数调用。这样的好处是降低了脚本冗余,需要时就直接引用,有点儿java中的方法封装的味道。

实例演示:

场景:

  用户下单操作前,需查库存是否充足的流程。将“查库存”的操作进行封装,然后使用 Include控制器进行调用。

  查库存操作的测试片段如下:

image.png

  通过接口获取商品信息,通过Json提取器提取变量,最后通过Include控制器调用“查库存”测试片段,演示如下:

包含控制器示例结果.gif

4、运行周期控制器(Runtime Controller)

  Runtime 控制器主要用来控制其子元件的执行时长的。

image.png

参数说明:

Runtime(seconds):

  • 运行时长(单位/秒),默认为1,去掉则默认为0,此时不执行其节点下的元件。

  • 和线程组的循环次数也有关系,如果是指定次数的话,总的运行时间 = 循环次数 * runtime 。

  • 如果循环次数是永远,那么 Runtime 控制器下的子项也会永远运行。

适用场景:

  在系统比较稳定的情况下,持续让系统运行一天一夜,有很多个用户(正常范围内的用户量)不停的发送请求,检验系统的运行稳定性,查看服务器是否有异常出现。

5、Switch 控制器

Switch 条件控制器,类似java中Switch逻辑控制语句。

image.png

参数说明:

Switch Value:

  匹配值,可以为数字,也可以是字符。当使用字符时,将匹配取样器的名称,如果匹配不上就会找取样器名称为 “default” 的取样器,再如果都找不到就不会执行。

示例演示:

场景:

  某业务流程出现多分支,比如当生成某个计划后需要审核,可能出现的结果有三个:审核通过、审核待定、审核拒绝。

image.png

  第一个取样器的下标为0,其他取样器按顺序依次叠加,随机函数会随机抽取一个执行。

6、While 控制器

While 条件控制器,其节点下的元件将一直运行知道While条件为false。

image.png

参数说明:

Condition(function or variable):

接受变量表达式与变量,另外提供了以下3个常量:

  • 空(不输入任何值):当循环中最后一个取样器失败后停止,否则一直循环。

  • LAST:当循环前有取样器失败则不进入循环,若进入循环则直到最后一个取样器失败后停止。

  • Otherwise:当判断条件为字符串“false”时停止循环。

补充一些常见值:

  • ${var_name}>10:数值大小对比,出现不成立的情况则停止。

  • ${BooleanValue}:布尔值字符串,出现false则停止。

7、交替控制器(Interleave Controller)

  交替控制器,其节点下的取样器会交替执行。假设我们线程组设置1个线程,循环3次;交替控制器下有两个取样器请求,分别为http1和http2,那么他们的执行顺序为:http1 --> http2 --> http1 。

image.png

参数说明:

  • 忽略子控制器块:勾选后,会令子控制器失效;不勾选的话子控制会单独作为一个节点执行,一次只允许每个控制器发出一个请求。

  • Interleave across threads:允许跨线程交替执行,勾选后,当线程组线程数大于1时,当前线程首次执行会根据线程数顺序进行交替,后续执行按自己所属线程的上一个次的执行的位置交替。

示例演示:

示例1(不勾选配置):

image.png

image.png

image.png

  子交替控制器生效,执行顺序为:12356,三个线程执行了3次。

示例2(忽略子控制器块):

image.png

image.png

image.png

  循环控制器失效和子交替控制器都失效了,只允许发出一个请求,执行顺序为:1235,三个线程执行了3次。

示例3(勾选Interleave across threads):

image.png

image.png

image.png

  执行顺序为:12356 23561 35612 ,每个线程下次开始执行的位置会后移一位。

8、仅一次控制器(Once Only Controller)

  仅一次控制器表示此控制器下的子元件只会执行一次,即便处于循环控制器之下。

示例演示:

场景:

  循环控制器循环三次,其中一个取样器只想要执行一次。

image.png

image.png

  结果如上图所示,http3在循环控制器中仅执行了一次。

9、吞吐量控制器(Throughput Controller)

  用来控制其下元件的执行次数,并无控制吞吐量的功能,主要用来控制其下的子节点的执行次数与负载比例分配。

image.png

参数说明:

  • Percent Executions:

  按执行次数的百分比来计算执行次数,此时 Throughput 取值是 0~100。

  • Total Executions:

  按 Throughput 的值来指定执行次数,可以是任意整数,如果小于等于 0,则一次也不执行。

  • Per User:

  1、如果使用Percent Executions模式。

    ①、不选“per user”,执行总次数 = 线程数 * 循环次数 * 吞吐量百分比。(最终值的小数位大于5就进1,如 11.51 就取 12,参考“探究配置方式 1”)。

    ②、选中“per user”,执行总次数 = (循环次数 * 吞吐量百分比)* 线程数 。(其中,若“循环次数 * 吞吐量百分比”的值大于0.5,则进1,如 4 * 13% = 0.52 ,进1,,参考“探究配置方式 2”)

  2、如果使用Total Executions模式。

    ①、不选“per user”,那么吞吐量给定的数字将是执行的总次数。

    ②、选中“per user”,则执行的总数将是用户数乘以给定的吞吐量数。

示例演示:

场景1:

  同一时间段内,有十个用户对系统进行访问,其中两组接口被访问次数分别为3次和5次,场景设计如下:

image.png

image.png

image.png

image.png

  根据结果可看出,http1接口被访问了3次;http2接口被访问了5次。

探究配置方式 1:

  使用 Percent Executions 但不勾选 Per User的场景:

image.png

image.png

image.png

就约等于的计算方式存疑,修改吞吐量的值,进行对比:

image.png

image.png

  未加吞吐量控制器前,http3应该被访问50次,但图上图中配置了吞吐量控制器,计算公式为:线程数 * 循环数 * 吞吐量百分比,最终结果小数位大于5就进1,否则舍去。

探究配置方式 2:

  使用 Percent Executions 且勾选 Per User的场景:

image.png

image.png

image.png

就约等于的计算方式存疑,修改吞吐量的值,进行对比:

image.png

image.png

  未加吞吐量控制器前,http3应该被访问50次,但图上图中配置了吞吐量控制器,计算过程为:循环数 * 吞吐量百分比(结果小数位大于5就进1,否则舍去),最后将值 * 线程数 = 执行次数。

10、条件控制器(if Controller)

可以通过某个条件来控制此节点下的元件是否运行。

image.png

参数说明:

  • Expression (must evaluate to true or false)

  表达式(值必须是true或false)

  • Evaluate for all children?

  默认不勾选,判断条件作用于每个子项。

  • “use status of last sample”按钮:

  点击该按钮,Expression 中会自动填充“${JMeterThread.last_sample_ok}”,表示使用该控制器之前,最后一个取样器的执行结果来控制是否执行。

  • Interpret Condition as Variable Expression?:

  默认勾选项,将条件解释为变量表达式(需要使用__jexl3 or __groovy 表达式)。

  ①、不勾选“interpret condition as variable expression”:

  Expression中直接输入我们需要判断的表达式即可,判断表达式为真时,执行if控制器下的请求。例如“1!=2”,则一定会执行下面的取样器。

  ②、勾选“interpret condition as variable expression”:

  此时,Expression中不能直接填写条件表达式,需要借助函数将条件表达式计算为true/false,可以借助的函数有_jexl3和_groovy。例如“{__jexl3(1==2,)}”或“{__groovy(1==2,)}”,则不会执行下面的取样器。

示例演示:

image.png

image.png

  条件不成立,不执行if控制器的子项。

11、模块控制器(Module Controller)

  可以通过模块控制器在当前测试计划中引用测试片段。

image.png

参数说明:

Module To Run:

  下拉列表,列出了测试计划及工作台包含的控制器,在此点击选中需要引入的测试片段。

示例演示:

依次调用“进入游戏”,“角色升级”,“退出游戏”的测试片段,进行场景模拟。

image.png

image.png

image.png

image.png

image.png

12、随机控制器(Random Controller)

  随机控制器节点下的元件随机选择一个运行,与交替控制器不一样的是节点下的元件运行顺序不定。

image.png

参数说明:

Ignore sub-controller blocks:

 $emsp;忽略子控制器,即子控制器失效,由随机控制器接管。(例如,勾选了此项,子控制器中有循环控制器,此时它就不再会循环了。)

13、随机顺序控制器(Random Order Controller)

其节点下的元件随机执行,不过每个元件只执行一次。

image.png

示例演示:

image.png

14、循环控制器 (Loop Controller)

可控制其节点下的元件的执行次数。

image.png

15、录制控制器(Recording Controller)

  官方推荐用于存放录制的脚本,无实际作用,可用简单控制器取代。

16、事务控制器(Transaction Controller)

  事务响应时间是我们衡量业务性能的主要指标,事务控制器可以把其节点下的取样器执行消耗时间累加在一起,便于统计。

具体参考:事务控制器

2

评论区