09、JMeter 教程 - 逻辑控制器下

4.6 Include Controller

Include控制器用来导入外部的测试片段(非完整的测试计划),在执行时会执行导入的测试计划,但是被导入的测试计划有特殊要求,它不能有线程组,只能包含简单的控制器及控制器下的元件。换句话说就是相当于加了一个执行单元,一个封装了的业务操作单元,类似我们程序开发中的函数(方法)一样。例如一个查询学生信息的业务操作我们用取样器来模拟,然后放到简单控制器中作为一个执行单元,别的地方也要用到时,我们可以不用重复造轮子直接引用过来。

一般来说,Include控制器和测试片段(Test Fragment)配合使用的比较常见。

4、 6.1新建:线程组>添加>逻辑控制器>Include控制器,如下图所示:;

 

4、 6.2关键参数说明如下:;

Name:名称,可以随意设置,甚至为空;

Comments:注释,可随意设置,可以为空;

Filename:文件名,必输字段,如果没有,就会报错。通过Filename的路径和文件名引用外部的jmx文件。

推荐可以将 Include控制器 与 Module控制器一起对比着学习,Include控制器 是从外部文件引用,只能引用整个测试片段的内容,Module控制器 是从内部文件中引用,引用上相对比较灵活,可以只引用部分测试片段或模块内容。这样一内一外不仅容易理解也容易记忆和学习。

4、 6.3实例;

  • 当Filename路径的值为空,程序执行报错,脚本执行中止,不会继续执行下面的脚本内容。

创建一个Filename路径为空的测试计划,运行JMeter,查看结果树(程序执行报错,脚本执行中止,不会继续执行下面 csdn首页 的取样器),如下图所示:

 

  • 当Filename路径中的文件不存在,程序直接弹窗报错并停止执行。

创建一个Filename路径中的文件不存在的测试计划,点击“保存”按钮的时候,就会直接弹窗报错。如下图所示:

 

1、 首先创建一个外部引用有测试片段的测试计划,如下图所示:;

 

2、 创建一个Filename路径的文件中包含测试片段的测试计划,将文件添加到Include控制器中,如下图所示:;

 

3、 运行JMeter,查看结果树(执行完控制器里的测试片段,再继续向下执行csdn首页的取样器),如下图所示:;

 

Test Fragment 相当于一个独立的部分,可以被其他测试计划引用,实现 样例的片段化,模块化,遇到重复需要的,比如登录、注册之类的,就可以用Test Fragment 和 Include Controller 了,这样可以避免重复

4.7 Interleave Controller

交替控制器,顾名思义是:互相交替,其节点下的取样器交替执行。根据被控制器触发执行次数,去依次执行控制器下的子节点。被触发执行可以由线程组的线程数、循环次数、逻辑控制器触发。

4、 7.1新建:线程组>添加>逻辑控制器>交替控制器,如下图所示:;

 

4、 7.2关键参数说明如下:;

名称:可以随意设置,甚至为空;

注释:可随意设置,可以为空;

忽略子控制器:即子控制器失效,由交替控制器接管。

勾选后,会无视节点下的所有控制器,将每个取样器作为一个单独字节点执行不勾选忽略子控制器,交替执行时,节点下次一级每个取样器、逻辑控制器都认为是一个单独子节点来交替执行。

Interleave across threads: 勾选此项,则交替控制器下的请求将应用至所有线程和循环中迭代。如有四个请求,三个线程,两轮循环,那么第一轮三个线程分别运行请求1,请求2,请求3,第二轮循环的三个线程运行请求4,请求1,请求2。

允许跨线程交替执行,勾选后,当线程组线程数大于1时,当前线程首次执行会根据线程数顺序进行交替,后续执行按自己所属线程的上一个次的执行的位置交替,如: 交替控制器下由A B C D E 5个接口, 设置线程组 线程数3个,循环4次,则最终执行结果为 线程1执行 A B C D 线程2执行 B C D E 线程3执行 C D E A 。

4、 7.3简单实例;

1、 在交替控制器下添加3个取样器访问csdn首页、访问我的首页和访问JMeter专栏,线程组下添加一个取样器访问百度,与交替控制器同层级,线程组设置循环次数为2,如下图所示:;

 

2、 配置好以后,运行JMeter,然后查看结果树(循环两次,每次只执行交替控制器里一个取样器),如下图所示:;

 

4、 7.4复杂实例;

就是将交替控制器嵌套使用,来看看执行结果,从而更进一步的理解和学习交替控制器。

  • 创建一个父交替控制器,其下两个子交替控制器:,子交替控制器下面分别添加2个取样器,设置线程组循环次数5,如下图所示:

 

  • 配置好以后,运行JMeter,然后查看结果树( 从结果可以看出,先交替子控制器的样例,再交替父控制器下的样例),如下图所示:

 

4、 7.5忽略子控制器块;

在交替控制器的设置界面,有这样一个选项,是否忽略子控制器,所以这里一般也是交替控制器作为父级控制器时使用的选项,这里的子控制器一般指非交替控制器的其他控制器 (如果子控制器也是交替控制器,该项实际和交替控制器的嵌套效果一样了)

1、 下面,我们在交替器下添加一个循环控制器,设置循环次数3,线程组循环次数设置为2,设置交替器勾选忽略子控制器,如下图所示:;

循环控制器:

 

线程组:

 

未勾选:

 

勾选后( 从结果可以看出,循环控制器没有执行3次,只执行了1次),如下图所示:

 

综上所述:以控制器为1个小单元,交替执行。

4.8 Critical Section Controller

我们先来看一下,官方的解释:The Critical Section Controller ensures that its children elements (samplers/controllers, etc.) will be executed by only one thread as a named lock will be taken before executing children of controller.

大致意思是: Critical Section Controller(临界区控制器),确保其子元素(采样器/控制器等)将仅由一个线程执行,因为在执行控制器的子元素之前将获取命名锁。

4、 8.1新建:线程组>添加>逻辑控制器>临界部分控制器,如下图所示:;

 

4、 8.2关键参数说明如下:;

Name:名称,可以随意设置,甚至为空;

Comments:注释,可随意设置,可以为空;

Lock name:锁名称,这里可以填入其子节点下执行的线程的名称,这个线程作为一个全局锁存在

4、 8.3实例讲解;

这部分主要是通过配合实例我们来理解一下开始那句话到底什么意思。

  • 测试场景:我们第一步首先要访问csdn首页,第二步找到我的首页,第三步点击JMeter专栏。按顺序完成三步,才能完成这个测试场景。那么我们根据这个场景用JMeter来添加多个请求的取样器。如下图所示:

 

  • 脚本调试是通了,运行JMeter,查看结果树,如下图所示:

 

  • 从上个图,查看结果树中显示请求结果数据不是按照顺序请求,不符合预期,这个时候增加一个critical section controller(临界部分控制器),增加一个锁,就能控制执行顺序。如下图所示:

 

  • 脚本调试是通了,运行JMeter,查看结果树,可以清楚地看出来是按预期的顺序执行请求的。但是这样响应时间会过长,这个后边再做讲解。如下图所示:

 

4、 8.4锁名分类;

1、 锁名为空,认为每个锁为不同的锁;

  • 通过具体实例,来看一下,创建锁名为空的临界部分控制器,如下图所示:

 

  • 运行JMeter,查看结果树,如下图所示:

 

2、 锁名相同,多个锁认为是同一个锁,同一个时间点只能存在一个运行中;

  • 创建锁名相同的临界部分控制器,运行JMeter,查看结果树,如下图所示:

 

3、 锁名为变量,根据变量值来判断是不是属于同一个锁,变量值为相同时,则认为是同一个锁;

  • 创建锁名为变量的临界部分控制器,如下图所示:

 

  • 运行JMeter,查看结果树,如下图所示:

 

4.9 Once Only Controller

在每个线程内,该控制器下的内容只会被执行一遍,无论循环多少次,都只执行一遍。。

此控制器通常用于控制需要登录的请求,测试过程中,我们往往都只需要登录一次,获取到对应的登录信息后即可执行后续相关的请求,而不是每执行一个请求都登录一次,如将login请求放入仅一次控制器,则在线程组循环运行期间,不论循环次数设置为多少次,login请求都将仅在第一次执行时运行

4、 9.1新建:线程组>添加>逻辑控制器>仅一次控制器,如下图所示:;

 

4、 9.2关键参数说明如下:;

名称:可以随意设置,甚至为空;

注释:可随意设置,可以为空。

4、 9.3实例;

线程组循环5次,测试csdn首页、我的首页,运行JMeter,如下图所示:

 

1、 将仅一次控制器用拖到循环控制器里边,配置好以后,点击“保存”,运行JMeter,然后查看结果树,如下图所示:;

 

 

4.10 Recording Controller

录制控制器,顾名思义是录制的时候会用到。实际上它是一个位置,当我们用JMeter代理进行录制时,录制的脚本默认放在此控制器的节点下面。没有实际的逻辑作用,我们用简单控制器也可以代替它。

4、 10.1新建:线程组>添加>逻辑控制器>录制控制器,如下图所示:;

 

4、 10.2关键参数说明如下:;

名称:可以随意设置,甚至为空;

注释:可随意设置,可以为空;

4.11 Random Controller

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

4、 11.1新建:线程组>添加>逻辑控制器>随机控制器,如下图所示:;

 

4、 11.2关键参数说明如下:;

名称:可以随意设置,甚至为空;

注释:可随意设置,可以为空;

忽略子控制器块:即子控制器失效,由随机控制器接管,类似交替控制器。

4、 11.3简单实例;

  • 创建测试计划,随机控制下添加3个请求,控制器外1个请求,线程3个;如下图所示:

 

  • 配置好以后,点击“保存”,运行JMeter,然后查看结果树( 从结果可以看出,设置了3个线程,每个线程都要访问一次http请求,但是控制器下边的取样器的访问却是随机访问一个),如下图所示:

 

4、 11.4随机嵌套循环-不勾选忽略子控制器;

  • 创建测试计划,如下图所示:

 

  • 配置好以后,点击“保存”,运行JMeter,然后查看结果树( 从结果可以看出,设置了3个线程,随机选择随机控制器下的两个循环控制器),如下图所示:

 

4、 11.5随机嵌套循环-勾选忽略子控制器;

配置好以后,点击“保存”,运行JMeter,然后查看结果树( 从结果可以看出,设置了3个线程,循环控制器也失效了,每次都随机选择一个取样器执行),如下图所示:

 

4、 11.6随机嵌套交替-勾选忽略子控制器;

配置好以后,点击“保存”,运行JMeter,然后查看结果树( 从结果可以看出,设置了10次循环,交替控制器也失效了,每次都随机选择一个取样器执行),如下图所示:

 

4.12Random Order Controller

随机顺序控制器其节点下的原件随机执行,不过每个元件只执行一次。

当控制器被触发时,将控制器下的所有子节点顺序打乱执行一遍,执行一遍;执行一遍,不是执行一个。

注意:是将子节点的顺序打乱,而非请求的顺序打乱,子节点可以是其他逻辑控制器。

随机控制器与随机顺序控制器名字十分接近,但两者还是有着明显的区别,可参考 上边介绍的随机控制器。

随机控制器为每次只执行节点下的一个子节点,随机顺序控制器是将节点下的所有子节点都正常执行,只是将执行顺序打乱

4、 12.1新建:线程组>添加>逻辑控制器>随机顺序控制器;

 

4、 12.2关键参数说明如下:;

Name:名称,可以随意设置,甚至为空;

Comments:注释,可随意设置,可以为空。

4、 12.3实例;

1、 创建测试计划;

2、 配置好以后,点击“保存”,运行JMeter,然后查看结果树(从结果可以看出,设置了10次循环,每次循环把所有的子节点都执行了);