性能工具之 JMeter 常用组件介绍(四)
本文主要介绍常用的逻辑控制器功能
一、前言
在上一讲中简单展示了常用组件,大家也只是有一个大概的概念,但是没有详细讲解怎么使用,这一讲中咱们聊一聊几个组件的常用规则。也许不是完全正确,可以参考下;
二、Logic Controller:逻辑控制器‘
先介绍下逻辑控制器,如图:
Logic Controller大概可分为两类:
- 控制测试计划执行过程中节点的执行顺序,如:Loop Controller、If Controller等;
- 对测试计划中的脚本进行分组、方便JMeter统计执行结果以及进行脚本的运行时控制等,如:Throughput Controller、Transaction Controller
1、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:循环控制器
- 作用:指定子节点运行的次数,可以使用具体的数值,也可以使用变量
- 参数:
- Forever选项:勾选上这一项表示一直循环下去
- 如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘的结果。
操作步骤:
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:吞吐量控制器
作用:控制其下的子节点的执行次数与负载比例分配,也有两种方式:
- Total Executions:设置运行次数,单位为次
勾选Per User:
- 1.线程数循环次数>=线程数吞吐量时,Total Executions模式的执行次数=线程数*吞吐量。
- 2.线程数循环次数<线程数吞吐量时,Total Executions模式的执行次数=当线程数*循环次数。
不勾选Per User:
-
1.线程数循环次数<=吞吐量时,Total Executions模式的执行次数=线程数循环次数。
-
2.线程数*循环次数>吞吐量时,Total Executions模式的执行次数=吞吐量。
-
Percent Executions:设置运行比例(1~100之间),单位为%
不管Per User是否勾选,按Percent Executions模式的执行次数都不受Per User影响,Percent Executions模式的执行次数=线程数循环次数吞吐量%。(循环次数=线程组循环次数*循环控制器循环次数)
- 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开始;
- 点赞
- 收藏
- 关注作者
评论(0)