冬去春来盼岁月,万物本来无一影;
在上一讲中简单展示了常用组件,大家也只是有一个大概的概念,但是没有详细讲解怎么使用,这一讲中咱们聊一聊几个组件的常用规则。也许不是完全正确,可以参考下;
一、Logic Controller:逻辑控制器
先介绍下逻辑控制器,如图:
Logic Controller大概可分为两类: l 控制测试计划执行过程中节点的执行顺序,如:Loop Controller、If Controller等; l 对测试计划中的脚本进行分组、方便JMeter统计执行结果以及进行脚本的运行时控制等,如:Throughput Controller、Transaction Controller1、If Controler:If控制器
说明:
作用 :根据给定表达式的值决定是否执行该节点下的子节点。 参数 : Condition(evaluated with javascript) :用javascript的解释器执行代码,返回 " true " 或者 "false" 。 Expression (must evaluate to true of false): 表示判断变量值是否等于字符串true或者false(不区分大小写)。比如: ${JMeterThread.last_sample_ok} 用来判断上个线程是否执行成功 Evaluate for all children :选中此项表示在每个子结点执行前都会计算表达式 Interpret Condition as Variable Expression? :选中此项表达式的条件为: Expression (must evaluate to true of false),不勾选为:Condition(evaluated with javascript)如:1、添加线程组 2、添加if逻辑控制器注:
1、文本框上的黄色感叹号,就是提示你,建议采用__jexl3 or __groovy 表达式,以提高性能,也就是默认的方式。
2、if 控制器 只能作用于其下的子项
3、添加结果查看树说明:
咱们再设置num初始值为7,但是条件判断中显示的是8;通过验证该if控制器生效。
假如把if控制器设置为8,查看结果为:
显示:
2、Transaction Controller:事务控制器
作用:
用于将Test Plan中的特定部分组织成一个Transaction,JMeter中Transaction的作用在于,可以针对Transaction统计其响应时间、吞吐量等。比如说,一个用户操作可能需要多个Sampler来模拟,此时使用Transaction Controller,可以更准确地得到该用户操作的性能指标,如响应时间等。这个时间包含该控制器范围内的所有处理时间,而不仅仅是采样器的。
参数:
Generate parent sample:勾选后,所有的结果将在父结点中展示(一般要勾选)
include duration of timer and pre-post processors in generated sample:勾选后会统计定时器(timer)的时间,否则只统计采样器(sample)的时间
演示:1、增加线程组2、增加事务控制器 增加两个请求3、添加聚合报告如图:第一个请求:
第二个请求: 添加聚合报告 运行结果: 把请求全部统计到一个事务中去,并且显示每请求信息; 修改事务控制: 运行查看结果显示,勾选后把所有请求合并到一个事务中:3、Loop Controller:循环控制器
作用 :指定 子节点 运行的次数,可以使用具体的数值,也可以使用变量 参数: l Forever选项:勾选上这一项表示一直循环下去 l 如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘的结果。操作步骤:1、添加线程组 2、添加Loop Controller控制器 3、添加简单java请求【目的为了学习所以才有java 请求】4、添加结果查看树
点击请求查看结果树:
如果勾选如图,表示永远执行
如图:
4、Once Only Controller:仅一次控制器
作用:在测试计划执行期间,每个线程内,该控制器下的子内容只执行一次,无论循环多少次都只执行一遍。登录场景经常会使用到这个控制器。
注意:将Once Only Controller作为Loop Controller的子节点,Once Only Controller在每次循环的第一次迭代时均会被执行。
1、添加线程组
2、添加
3、添加java请求
4、添加结果查看树
5、效果
5、 Include Controller:包含控制器
作用:引用外部的脚本,用来导入外部测试片段(),在执行时会导入。但是导入的测试片段不能包含线程组,只能包含简单的控制元件及控制元件下的子元件(controller和sampler)
操作步骤
1、添加线程组
2、添加Include Controller插件
选择脚本:
添加:{Test Fragment}片段脚本
添加到Include 中
3、添加结果查看树
6、 Module Controller:模块控制器
作用:可以快速的切换脚本,不用来回的新建,方便脚本调试
1、添加两个【Test Fragment】并且在两个模块下新建两个测试【Test Fragment -1】
如上图、添加模块控制器;
操作步骤
1、添加线程组
2、添加 module controller
选择第一个模块点运行:
结果:
3、选择第二模块
4、添加结果查看树
说明:
通过这个模块可以轻松控制两个模块切换
7、 Throughput Controller:吞吐量控制器
作用:控制其下的子节点的执行次数与负载比例分配,也有两种方式:
l Total Executions:设置运行次数,单位为次
勾选Per User:
1.线程数*循环次数>=线程数*吞吐量时,Total Executions模式的执行次数=线程数*吞吐量。
2.线程数*循环次数
不勾选Per User:
1.线程数*循环次数<=吞吐量时,Total Executions模式的执行次数=线程数*循环次数。
2.线程数*循环次数>吞吐量时,Total Executions模式的执行次数=吞吐量。
l Percent Executions:设置运行比例(1~100之间),单位为%
不管Per User是否勾选,按Percent Executions模式的执行次数都不受Per User影响,Percent Executions模式的执行次数=线程数*循环次数*吞吐量%。(循环次数=线程组循环次数*循环控制器循环次数)
l Per User:勾选该项的话则按虚拟用户数(线程数)来计算执行次数,不勾选则按所有虚拟用户数来计算执行次数
操作步骤
1、添加线程组
2、添加 7DGroup - Throughput Controller
3、添加java请求
4、添加结果查看树
5、效果
8、 Runtime Controller:时间控制器
作用 :用来控制其子元件的执行时长 参数 : Name:名称,可以随便填写 Comments:注释,可以随便填写,可以为空 Runtime(seconds):其下组件执行时长,默认为1秒,为0表示其下的组件不执行。 注意:如果此控制器设置的时间指的是该控制器下子节点的执行时间,Thread Group中设定的时间是整个线程组的整体执行时间。一般线程组中的时间要比Runtime Controller设定的时间要大,Runtime Controller设定的时间到了之后,执行Thread Group中其他组件,如果没有其它组件的话会继续执行Runtime Controller中的内容。如果Thread Group中设定的时间比Runtime Controller中设定时间小的话就会按线程组中顺序执行,执行时间到了的话就不会执行Thread Group后面的请求。操作步骤
1、添加线程组
2、添加Runtime Controllerr如图
3、添加http请求
添加第一请求
添加第二个请求
4、添加View Results in Table
9、 Interleave Controller:交替控制器
作用:每次循环中交替执行不同的controller中请求
参数:
ignore sub-controller blocks:勾选后,子控制器每次只能发起一个请求
Interleave accross threads:勾选之后,第1次循环执行第一个子元素、第2次循环2执行第二个子元素、第3次循环执行第三个子元素。。。
操作步骤
1、添加线程组
2、添加Interleave Controller
3、添加http请求
4、添加结果查看树
10、Random Controller:随机控制器
作用:随机执行其下的子节点
操作步骤
1、添加线程组
2、添加Random Controller
3、添加http请求
4、添加结果查看树
11、 ForEach Controller
作用 :依次调用用户定义的变量,直到最后一个,结束循环。为了满足ForEach Controller提取数据,变量命名的格式一般为“变量名_数字 ” ,其中数字从1开始。 参数说明 : Input variable prefix :输入变量的前缀,也就是自定义变量的前缀; Start index for loop(exclusive) :循环的起始索引index,但是不包含当前值。也就是从index+1开始。 End index for loop(inclusive) :循环结束的索引,包含这个值。 Output variable name :输出的变量名,后续可通过${}引用 Add "_" before number? :如果定义的变量名中有下划线的话就要勾选此项,否则找不到;反之,没有的话不要勾选,否则同样找不到变量操作步骤
1、添加线程组
2、添加ForEach Controller
3、添加http请求
4、添加结果查看树
5、效果
12、 Switch Controller
作用:和编程语言中的switch语句类似,执行Switch Value中指定的请求
参数说明:
Switch Value:指定请求的索引或者名称,索引从0开始,如果没有赋值,或者索引超过请求个数的话就执行第0个请求。
操作步骤
1、添加线程组
2、添加Switch Controller
设置条件为2:
3、添加http请求
4、添加结果查看树
运行结果从索引0开始;
在这里引用一句诗送给在阅读的自己
尘劳迥脱〔唐〕希运
尘劳迥脱事非常,紧把绳头做一场。
不是一番寒彻骨,争得梅花扑鼻香。