控制器2
添加简单控制器
线程组下可以添加控制器,控制器下可添加http请求,也可添加控制器。简单控制器如下
所以简单控制器就是分组,没有任何作用。
随机控制器:随机控制器的作用类似于交替控制器,不同在于它不是通过其子控制器和采样器按顺序排列,而是在随机选取一个。
示例:添加随机控制器,设置线程组设置循环次数为6,向线程组添加一个”获取文件列表“请求。向交替控制器添加两个请求:“下载文件A”、“下载文件B"
运行之后,可以看到跟交替控制器的区别,每次通过该随机控制器下请求时随机取。
随机顺序控制器:随机顺序控制器类似简单控制器,区别在于该控制器下的节点请求执行顺序是随机的。
示例:向随机顺序控制器中添加以下5个HTTP请求,运行后,可以看到该控制器下的5个HTTP请求顺序是随机的。
案例一:
一、认识循环控制器
如下图:新增一个循环控制器
循环控制器的设置界面:
循环次数:永远和自定义次数,这个应该比较好理解。
二、使用循环控制器
其实大家对Jmeter的熟悉的话,应该会想到,线程组 这个设置界面也是有一个循环次数的设置,那么到底他们两个有什么关联呢。我理解为父子关系。
下面举个例子,
首先在线程组中设置循环次数3,循环控制器中设置循环测试2,其他默认,添加一个计时器,方便查看结果,如下:
执行后,查看结果树:
理解为:一秒发送一个请求,循环三次,每次循环中又循环两次。
for(int i=1;i<=3;i++){ 线程组中的循环
for(int j=1;j<=2;j++){ 循环控制器中的循环
执行
}
}
使用场景:一对多的关系。比如 创建一个部门,然后在该部门下创建多个员工。就用到了循环控制器。
转自:https://www.cnblogs.com/sandymonk/p/11572867.html
案例二:
任务:通过获取mysql数据库表中的字段,作为http请求中的查询参数
一、添加jdbc请求
1、新增测试计划-线程组-jdbc连接配置,完成数据库连接配置
2、添加jdbc请求
3、添加查看结果树,接着执行jdbc请求,查看jdbc请求的结果
4、添加debug sampler,接着执行jdbc请求,可以查看jdbc请求成功后,相关的变量,我将要拿这个title的变量值作为访问请求的参数
二、添加循环控制器
1、配置循环控制器
2、添加计数器
3、添加http请求
4、执行http请求,查看结果树,发现报错了,因为变量值里面含有空格,url解析报错,我们要想方法把空格去掉
5、使用BeanShell取样器来处理变量值中的空格,添加BeanShell取样器并放置在http请求前,并且添加对应的脚本
6、执行线程组下的所有请求,接着查看结果树,发现http请求报错
处理方式:添加HTTP信息头管理器,将浏览器调试器的请求头信息复制到HTTP信息头管理器的配置中
执行线程组下的所有请求,查看结果树,http请求成功
引言
在线程组里面写了2个接口,一个是登陆的接口获取token,另外一个是需要拿到token才能访问用户订单信息的接口。
我只想对第二个接口发多次请求做压测,不需要每次都去执行登录,于是可以用到逻辑控制器-仅一次控制器。
仅一次控制器
在线程组下添加逻辑控制器,仅一次控制器
只需要登陆一次,于是把登录放到一次控制器下
在登录后,通过后置处理器-json处理器或者正则表达处理器,获取登录返回的token值
当设置一个线程时,循环10次,运行后查看结果树和聚合报告
switch控制器
该控制器可以控制他里面的请求根据某些规则在不同num时选择控制器下的对应数字位的不同sampler。一般可以用在模拟多线程同时操作不同请求的测试场景。
简单使用
设置0
这是为1
这个num可以通过计数器,counter函数,random函数来自动生成(一般常用random函数)。也可以通过CSV参数化文件来生成,切记数字数量不能大于请求数,但是这里有个特别的地方,0也是第一个,7也是第一个请求。所以要设置的话计数器要么是0-6,要么就是1-7
注意
取得switch value的值,通过对节点下所有取样器、逻辑控制器的下标、名称匹配去执行,switch value的值可以为数字、字符串、变量等等
当switch value的值为0和正整数时,只会对当前节点下的取样器、逻辑控制器的下标进行匹配,不会对名称匹配。<下标是从0开始,即0为第一个取样器/逻辑控制器>
当switch value的值为空、为0、为正整数时,如果值超出了节点下的下标范围,则会默认执行节点下第一个取样器或逻辑控制器。
当switch value的值为负数、小数、字符串时,如果无法通过名称匹配到取样器、逻辑控制器,则会跳过当前控制器。
当switch value的值通过名称匹配到多个结果时,只会按照正序执行第一个取样器、逻辑控制器。
Runtime控制器:控制其子节点运行多长时间,控制器将运行其子项,直到超出配置的运行时间。runtime为0时表示没有运行。
示例:(1)添加Runtime控制器,登录http请求放入其中,线程组循环次数默认1。Runtime Controller的runtime设为5s
(2)添加监听器-察看结果树,点击运行,登录http请求运行了5s就结束了。
什么是逻辑控制器
JMeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”。
意思是说,逻辑控制器可以控制采样器(Samplers)的执行顺序。
由此可知,控制器需要和采样器一起使用,否则控制器就没有什么意义了。放在控制器下面的所有采样器,都会当做一个整体,执行时也会一起被执行。
JMeter提供了多种逻辑控制器,它们各个功能都不相同,大概可以分为两种使用类型:
控制测试计划执行过程中,节点的逻辑执行顺序,如:ForEach Controller(ForEach控制器),Loop Controller(循环控制器)、If Controller(如果if控制器)等;
对测试计划中的脚本进行分组,方便JMeter统计执行结果,以及进行脚本的运行时控制等,如:Throughput Controller(吞吐量控制器)、Transaction Controller(事务控制器)等。
2、如果控制器介绍
在实际工作中,当使用JMeter做性能测试脚本或者接口测试脚本时,当遇到需要对不同的条件做不同的操作时,我们可以使用JMeter中如果(If)控制器来实现。
添加如果(If)控制器组件操作:选中“线程组”右键 —> 添加 —> 逻辑控制器 —> 如果(If)控制器。
界面如下图所示:
如果(If)控制器组件界面说明:
名称:如果(If)控制器组件的自定义名称,见名知意最好。
注释:即添加一些备注信息,对该如果(If)控制器组件的简短说明,以便后期回顾时查看。
Expression (must evaluate to true or false):填写条件表达式,评估结果必须为真或假。
换句话说,是执行流程验证的条件,用于决定是否应执行子元件。默认情况下,条件被解释为true或false的JavaScript代码。
Interpret Condition as Variable Expression?:将条件解释为变量表达式?
意思是说:
如果不勾选此选项,则输入的条件表达式,将会使用JavaScript进行解析,得到需要的true/false结果。
如果勾选此选项:
1)输入的条件表达式,不会使用JavaScript进行解析,而是将条件视为JMeter的变量。
2)如果需要进行条件判断,则需要使用__jexl3或者__groovy函数,来生成函数表达式。通过函数表达式,得到需要的true/false结果。
Evaluate for all children?:条件作用于每个子项进行评估。
如果勾选该项,则该控制器在每一个子节点执行时前,执行一次。
默认情况下,该控制器可以对在其下面的所有可运行的组件,进行控制执行,但只在入口执行一次。
说明:
意思为:
为了提升性能,建议将“将条件解释为变量表达式”勾选。
并使用__jexl3或者__groovy函数,来评估表达式条件的真假。
并且${JMeterThread.last_sample_ok}变量,可用于测试最后一个采样器是否成功。
默认“将条件解释为变量表达式”是勾选状态,取消勾选,则上面的提示会变红。
3、如果控制器的使用
(1)测试计划内包含的元件
添加元件操作步骤:
创建测试计划。
创建线程组:选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组。
在线程组中,添加逻辑控制器“如果(If)控制器”组件:选中“线程组”右键 —> 添加 —> 逻辑控制器 —> 如果(If)控制器。
在逻辑控制器中,添加取样器“HTTP请求”组件:选中“逻辑控制器”右键 —> 添加 —> 取样器 —> HTTP请求。
在线程组中,添加监听器“察看结果树”组件:选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树。
最终测试计划中的元件如下:
Jmeter高级性能测试实战
https://edu.csdn.net/course/detail/35834
点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。
(2)如果控制器界面内容
我们演示使用JavaScript解析表达式的用法,步骤如下:
取消勾选Interpret Condition as Variable Expression?选项,否则将不能使用JavaScript解析表达式。
在条件输入框中,输入最基本的条件表达式即可。
我编写了一个恒true的表达式,如下图所示:
(3)HTTP请求界面内容
一个标准的 Get请求,访问百度首页,不做过多说明。
如下图所示:
4)运行结果
因为如果(If)控制器中的表达式为true,所以可以执行它下面的所有取样器请求。
如下图所示:
若如果(If)控制器中的表达式解析结果为false,则该控制器下面的请求则不执行。
4、如果控制器中表达式的写法
如果(If)控制器中的表达式有两种方式:
一种使用JavaScript语言解析条件表达式,表达式为基本的条件表达式写法。
另一种是使用__jexl3或者__groovy函数,通过函数表达式,得出我们需要的true或false结果。
(1)使用JavaScript语言解析表达式
即:取消勾选Interpret Condition as Variable Expression?选项。
最基本的几种写法:
数字判断表达式:${var}==1。
字符串判读表达式:"${var}"=="字符串"。
提示:如果${var}参数化变量取到的值本身就带双引号,则前边不需要加双引号。
如果${var}参数化变量的值就是一个布尔值,则表达式为:${var}。
但是要注意,布尔值变量必须都是小写的。
说明:${var}表示参数化变量的引用。我们可以引用自定义变量,或者CSV文件读取到的数据,在或者是上一个请求中提取来的值。
(2)使用函数来编写条件表达式
即:勾选Interpret Condition as Variable Expression?选项。
我们需要用到函数助手中的__jexl3或者__groovy函数,直接输出true/false结果。
下面以__jexl3函数为示例,进行演示。
__jexl3函数界面如下:
参数说明:
JEXL expression to evaluate:填写要计算的表达式。
Name of variable in which to store the result (optional):给函数结果定义一个可被引用的变量名(可选)。
__jexl3函数条件格式:${__jexl3(条件表达式)}
==是否等于,如${__jexl3(${VAR}==1,)},判断${VAR}变量是否等于1。
!=不等于,如${__jexl3(${VAR}!=1,)},判断${VAR}变量是否不等于1。
!非,如${__jexl3(!(${VAR}!=1),)},对${VAR}!=1的结果取反。
&&且和||或,如${__jexl3(${VAR}==1 && "${name}" != "张三",)}。
>大于或者>=大于等于,如${__jexl3(${count}>=10,)}。
编辑好的界面内容如下:
提示:
把生成的__jexl3函数表达式,粘贴到如果(If)控制器界面中。
看到The result of the function is中有值,说明表达式正确,但是上面返回false这个值,不一定正确,还要看脚本运行中实际的结果。
这样就完成了使用__jexl3函数编写表达式的用法。(__groovy函数同理)
说明:
尽可能使用"解释条件作为变量表达式"选项,然后使用__jexl3或者__groovy函数生成条件表达式。
因为运行模拟大量用户的性能脚本时,这样消耗的资源最小。
WHY?
If Controller使用JavaScript解释条件,是每个解释都占用资源,但本来就是一个测试性能的软件,不应因解析条件而消耗更多的资源。
即:如果你使用“解释条件作为变量表达式”,而不是使用Javascript解释表达式,这样能节省更多的性能资源。
(3)Evaluate for all children?选项说明
如果你勾选了Interpret Condition as Variable Expression?选项,同时也勾选了Evaluate for all children?选项。
则填写在如果(If)控制器中的表达式,需要为${JMeterThread.last_sample_ok}。
${JMeterThread.last_sample_ok}表达式的意思是:检查上一个请求是否成功。
而整个控制流程的效果是,控制其下的所有取样器:
如果前一个请求为成功,则${JMeterThread.last_sample_ok}为true,否则为false。
下一个请求拿${JMeterThread.last_sample_ok}的值来判断是否执行,如果为true,则继续执行,如果为false则不执行,且后边的所有请求都不执行。
如下图所示:
5、拓展
有一个小示例:我准备了20多条测试数据,但是我只想执行指定的几个测试数据。
有什么解决办法吗?
测试数据如下所示:
1)需求:执行指定的用例5
这时我们可以id为作为条件判断,来执行用例5。
表达式为:${__jexl3(${id} == 5,)}
(2)需求:执行奇偶数用例
执行奇数用例,表达式为:${__jexl3(${id}%2 == 1,)}
执行偶数用例,表达式为:${__jexl3(${id}%2 == 0,)}
(3)执行多条随机指定用例
5条以内用||来解决。
5条以上,使用在构造数据中打标签的方式来实现。
run字段,1表示执行,0表示不执行。
表达式为:${__jexl3(${run} == 1,)}
(4)提示
以后工作中的控制器千万不要写成下面这样哦!
Jmeter的while控制器
最近遇到一个项目问题,需要不断向被测服务器发送某个http请求直到返回信息中包含特定信息,该请求才算成功,但是考虑到大并发测试时,被测系统对该请求出现无返回现象,从而导致进入死循环,为避免出现该情况,再增加一个限制,该请求最多执行10次,超过10无返回直接跳出该循环
下面使用while controller实现上述功能
1、首先给循环次数设置初始值
g_counter为循环次数初始值
2、设置判断条件
${__javaScript("${b}"=="3" && ${g_counter}<10,)}
3、循环体,设置循环次数自增1
int a1=Integer.valueOf(${a});
a1=a1+1;
String bb=String.valueOf(a1);
vars.put("a",bb);
log.info("============进入IF了");
log.info("a1============="+a1);
log.info("bb============="+bb);
4、执行,观察结果