前言:Jmeter中逻辑控制器(Logic Controllers)的作用域只对其子节点的sampler有效,作用是控制采样器的执行顺序。
Jmeter提供了17种逻辑控制器,它们各个功能都不尽相同,大概可以分为2种使用类型:
①控制测试计划执行过程中节点的逻辑执行顺序,如:Loop Controller(循环控制器)、If Controller(如果if控制器)等;
②对测试计划中的脚本进行分组,方便JMeter统计执行结果以及进行脚本的运行时控制等,如:Throughput Controller(吞吐量控制器)、Transaction Controller(事务控制器)等;
jmeter提供如下17种逻辑控制器:
一、临界区控制器(critical section Controller)
作用:临界区控制器确保其子节点下的取样器或控制器将被执行(只有一个线程作为一个锁)
名称和注释很简单,就是给控制器添加一个备注,使人明白这个控制器的解释含义的意思;
Lock name:锁名称,这里可以填入其子节点下执行的线程的名称,这个线程作为一个全局锁存在;
2、遍历循环控制器(ForEach Controller)
作用:用来遍历当前元素的所有可执行场景;在用户自定义变量中读取一系列相关的变量,该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值;
输入变量前缀:在其中输入需要遍历的用户参数(User Parameter)
Start index for loop(exclusive):循环指数开始(唯一)→ 遍历查询的变量范围,开始的值(这里如果不填写,默认从1开始,如果没有1开始的变量,执行时会报错);
End index for loop(inclusive):循环指数结束(包含)→ 遍历查询的变量范围,结束的值;
输出变量名称:将遍历查询到的符合条件的用户参数赋值给输入变量(Vname),然后就可以在控制器下的取样器使用,格式为${输出变量名};
Add”_”before number:输入变量名称中是否使用“_”进行间隔
PS:这个控制器一般配合配置元件→ 正则表达式提取器来一起使用,可对页面上的某些元素进行重复处理。
3、包含控制器(Include Controller)
作用:用于引用外部的Jmx文件;从而控制多个测试计划组合
include Test Plan:包含测试计划的文件名,可以点击浏览,从文件夹保存的JMX文件夹目录下选择对应的JMX文件
使用方法:创建一个测试计划,下面可添加取样器/控制器等,然后保存测试计划,为了方便起见, 线程组也可以添加外部JMX文件中用于调试;
如果测试使用Cookie或用户定义的变量,这些应放置在顶层(包括文件),否则无法正常工作;此元素不支持变量/函数在文件名字段中;但是,如果属于包含控制器定义的内容,则使用前缀路径名。
(1)当Filename路径的值为空,程序执行报错,脚本执行中止,不会继续执行下面的脚本内容。
1、首先创建一个Filename路径为空的测试计划,如下图所示:
2、运行JMeter,查看结果树(程序执行报错,脚本执行中止,不会继续执行下面 访问博客园首页 的取样器),如下图所示:
(2)当Filename路径中的文件不存在,程序直接弹窗报错并停止执行。
1、首先创建一个Filename路径中的文件不存在的测试计划,点击“保存”按钮的时候,就会直接弹窗报错。如下图所示:
(3)当Filename路径的文件中不包含测试片段,跳过控制器,继续向下执行。
1、首先创建一个外部引用没有测试片段的测试计划,如下图所示:
3、运行JMeter,查看结果树(跳过控制器,继续向下执行 访问博客园首页 的取样器),如下图所示:
(3)当Filename路径的文件中包含测试片段,执行完控制器,再继续向下执行。
1、首先创建一个外部引用有测试片段的测试计划,如下图所示:
2、创建一个Filename路径的文件中包含测试片段的测试计划,将上边的外部引用-有测试片段文件添加到Include控制器中,如下图所示:
3、运行JMeter,查看结果树(执行完控制器里的测试片段,再继续向下执行 访问博客园首页 的取样器),如下图所示:
到这里,大家应该理解了 Include Controller 和 Test Fragment 了吧。宏哥的理解就是,Test Fragment 相当于一个独立的部分,可以被其他测试计划引用,实现 样例的片段化,模块化,遇到重复需要的,比如登录、注册之类的,就可以用Test Fragment 和 Include Controller 了。这样可以避免重复造轮子,做许多无用功。
4、生命周期/运行周期控制器(Runtime Controller)
作用:用于控制该控制器下的取样器/控制器的运行时间
Runtime(seconds):运行时间,单位为:秒
5、转换控制器(Switch Controller)
作用:通过给该控制器中的value赋值,来指定运行哪个取样器(也可以理解为开关控制器)
Switch value:控制器具体赋值的value值字段
有两种赋值方式:
①第一种是数值,Switch控制器下的子节点从0开始计数,通过指定子节点所在的数值来确定执行哪个元素。
②第二种是直接指定子元素的名称,比如采样器的Name来进行匹配。当指定的名称不存在时,不执行任何元素。
当Value为空时,默认执行第1个子节点元素。
6、当/判断控制器(While Controller)
作用:运行其子节点下的取样器/控制器,直到条件为“假”
Condition(function or variable):条件(函数或变量):里面可填入判断依据的条件,参照
使用方法:可能的条件值有:
①.空白:最后一个示例循环失败时退出循环;
②.最后一个值:最后一个示例循环失败时退出循环。 如果之前的最后一个示例只是循环失败,不进入循环。
③.否则:退出时(或不输入)循环条件等于字符串“ 假 ”
7、事务控制器(transaction controller)
作用:生成一个额外的采样器来测量其下测试元素的总体时间;值得注意的是,这个时间包含该控制器范围内的所有处理时间,而不仅仅是采样器的;
Generate parent sample:生成父样本(不同的模式选择)
include duration of timer and pre-post processors in generated sample:包含时间的计时器和前后处理器生成的示例(不同的模式选择)
对于Jmeter2.3以上的版本,有两种模式的操作:
① 事务采样器是添加到其下采样器后面的
② 事务采样器是作为其下采样器的父采样器
生成的事务采样器的测量的时间包括其下采样器以及其他的一切时间。由于时钟频率问题,这个时间可能略大于单个采样器的时间之和;
时钟开始时间介于控制器记录开始时间与第一个采样器开始之间,时钟结束时间亦然。
事务采样器只有在其子采样器都成功的情况下才显示成功。
在父模式下,事务控制器下的各个采样器只有在结果树里才能看到;同时,子采样器的数据也不会在CSV文件中显示,但是在XML文件中可以看到。
8、交替控制器(creatleave controller)
作用: 交替控制,使得该控制器包含的取样器步骤交错执行在每个循环中
忽略子控制器模块(Ignore sub-contorller blocks):如果勾选此项,交错控制器将sub-controllers像单一请求元素一样,一次只允许一个请求/控制器
使用方法:假使该控制器下有2个取样器A和B,交替执行A和B2个请求,即每次传递一个子请求到这个测试,按子元件的排列顺序
9、仅一次控制器(once only controller)
作用:在多线程循环的时候,将使其子节点下的取样器请求只运行一次
总共有两种执行模式:百分比执行和总执行
总执行(Total Executions):使控制器停止执行一定数量的测试计划
百分比执行(Percent Executions):使控制器按一定比例执行迭代的测试计划
流量(Throughput):对应上面的执行数量或者比例
每个用户(Per User):每个用户
如果勾选此项,将导致控制器计算是否应该执行在每个用户(每个线程)的基础上;如果不加以控制,那么将计算全球所有用户
11、IF控制器(If Controller)
作用:允许用户控制该控制器下面的取样器/控制器是否执行该节点下的子节点;
条件(默认JavaScript)(Condition(default javascript)):使用JavaScript的函数或变量进行评估判断条件为真或假
条件解释为变量表达式(interpret condition as variable expression):如果勾选该项,那么变量表达式会进行求值,并与“ture”或“false”进行比较,而无需使用JavaScript
对所有子条件执行(evaluate for all children):如果勾选该项,则该controller在没一个子节点执行时执行一次;
默认情况下,该控制器可以对包含在其下面的所有可运行的元素进行执行,但只在入口执行一次。
12、录制控制器(Recording Controller)
作用:类似代理服务器的作用,在测试执行期间记录测试样本。
清除所有记录的样本(Clear all the recorded samples):点击可以清除所有已经记录的测试样本。
一般情况下,在测试执行时候,它没有效果,但是在执行HTTPS测试脚本时,会记录下所有测试样本。
13、循环控制器(Loop Controller)
作用:该控制器下的取样器请求可以循环运行。
循环次数(Loop Count):在输入框中输入需要循环的次数,控制器下的请求即可循环运行。
永远(forever):如果勾选该项,那么控制器下的请求可一直运行。
14、模块控制器(Module Controller)
作用:测试控制器子节点下的某一个模块,而不是整个测试计划。
寻找目标元素(Find target element):寻找测试计划中需要特定测试的元素,模块;也可理解为该控制器可以控制已经封装好的模块元素
△ :一个测试计划由一个控制器和所有的测试元素(取样器等)组成,测试计划可以位于任何线程组或工作台;如果计划位于线程组,则可以禁用其他控制器,防止正在运行的测试计划被影响(除了模块控制器)
模块控制器的优势在于:当存在多个线程组时,该控制器可以轻松切换,只需要选择对应的取样器,方便快捷,替代了创建很多测试计划的繁琐操作
△ :任何一个模块所用的控制器名字必须唯一,因为其名字被用来找到目标控制器时重新加载;出于这个原因,最好保证控制器名字不同,否则执行测试时候可能发生意外
△ :模块控制器与远程测试不应使用或非gui测试与工作台部件,因为工作台测试元素并没有测试计划的一部分 jmx 文件。 任何这样的测试就会失败。
15、简单控制器(Simple Controller)
作用:用来组合取样器和其他逻辑控制器
简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可用来命名某些操作。
16、随机控制器(Random Controller)
作用:类似交替控制器,但该控制器随机选取某一个取样器请求并执行
忽略子控制器模块(Ignore sub-controller blocks):如果勾选此项,交错控制器将sub-controllers像单一请求元素一样,一次只允许一个请求/控制器。
关键参数说明如下:
Name:名称,可以随意设置,甚至为空;
Comments:注释,可随意设置,可以为空;
Ignore sub-controller blocks:忽略子控制器,即子控制器失效,由交替控制器接管。
勾选后,会无视节点下的所有控制器<交替控制器、随机控制器例外>,将每个取样器作为一个单独字节点执行
不勾选忽略子控制器,交替执行时,节点下次一级每个取样器、逻辑控制器都认为是一个单独子节点来交替执行。
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 。
PS:配置好以后,运行JMeter,然后查看结果树(循环两次,每次只执行交替控制器里一个取样器)
17、随机顺序控制器(Random Order Controller)
作用:类似于简单控制器,将执行每个子节点下的取样器请求一次,但是执行是随机的
参考文章:https://www.cnblogs.com/imyalost/p/6183569.html
参考公众号:北京宏哥