逻辑控制器

逻辑控制器可以改变来自它们的子元件的请求顺序。它们可以修改请求本身,导致Jmeter重复请求,让你定制当发送请求时的请求规则。

  • 逻辑控制器: 定义Jmeter发送请求的行为逻辑,设定请求的顺序,可以与Sampler结合使用模拟复杂的请求序列。
  • 断言:设定实际期望的返回结果,通过它可以知道请求是否成功。
  • 前置处理器和后置处理器:发送请求前和完成工作。前置处理器常常用来修改请求的设置或更新变量。后置处理器则常常用来处理响应的数据和从它里面获取参数值。
  • 定时器: 负责定义请求之间的延迟间隔。

一、简单控制器Simple Logic Controller

  • 简单控制器允许组织采样器和其他逻辑控制器。
  • 你可以将其简单的理解为单元的意思或者分组的意思,它不提供什么意义,不改变元件的执行顺序。(可以在里面继续添加控制器)
  • 你可以用它来规范你的元件,规范脚本。使用它养成良好的习惯。
  • 简单逻辑控制器对JMeter如何处理您添加到其中的控制器没有影响。

二、循环控制器

如果将生成器或逻辑控制器添加到循环控制器,除了为线程组指定的循环值之外,JMeter还将循环它们一定次数。例如,如果将一个HTTP请求添加到循环计数为2的循环控制器,并将线程组循环计数配置为3,则JMeter将发送总共2 * 3 = 6个 HTTP请求。
循环次数:每次通过测试运行时,将重复此控制器的子元素的次数。值-1等同于Forever永久。

在这里插入图片描述

三、仅一次控制器(Once Only Logic Controller)

仅一次控制器告诉JMeter每个线程只处理一次内部的控制器,并在进一步迭代测试计划期间传递其下的任何请求。
作用:在测试计划执行期间,该控制器下的子结点对每个线程只执行一次,登录场景经常会使用到这个控制器。

  • 仅一次控制器现在将始终在任何循环父控制器的第一次迭代期间执行。因此,如果将一次控制器放置在指定为循环5次的循环控制器下,则仅一次控制器将仅在第一次迭代时通过循环控制器执行(即每5次,即5次为一个单位,循环5次,一次控制器只执行一次)。

注意:

  • 1.仅一次控制器放在循环控制器下面,循环控制器循环5次,仅一次控制器也只执行1次。
  • 2.仅一次控制器放在线程组下面,线程组执行5次,仅一次控制器执行5次。
    另外,对于需要登录的测试,请考虑将登录请求放在此控制器中,因为每个线程只需登录一次即可建立会话。

四、交替控制器

在这里插入图片描述

1.简单使用

如下图,设置1个线程,执行3次:
在这里插入图片描述
运行结果如下图:
在这里插入图片描述

2.嵌套一个控制器,不勾选忽略子控制器

测试计划如下图:
在这里插入图片描述
嵌套一个循环控制器,循环次数设置3次
在这里插入图片描述
线程组设置1个线程,执行5次
在这里插入图片描述
执行结果如下图:
在这里插入图片描述
总结:交替执行到循环控制器时,循环执行结束后,在进行下一次的交替。

3.嵌套一个控制器,勾选忽略子控制器
直接使用2的测试计划,在交替控制器中勾选忽略子控制器
在这里插入图片描述
还是1个线程,执行5次,执行结果如下:
在这里插入图片描述
总结:循环控制器不生效了。

4.交替控制器的嵌套
1个交替控制器下嵌套2个交替控制器,如下图:
在这里插入图片描述
设置1个线程,执行5次,执行结果如下:
在这里插入图片描述
总结:以控制器为1个小单元,交替执行。

五、随机控制器

随机控制器:随机控制器的作用类似于交替控制器,不同在于它不是通过其子控制器和采样器按顺序排列,而是在随机选取一个。

六、随机顺序控制器

当控制器被触发时,将控制器下的所有子节点顺序打乱执行一遍,执行一遍,执行一遍,不是执行一个。
**注意:**是将子节点的顺序打乱,而非请求的顺序打乱,子节点可以是其他逻辑控制器。

随机控制器和随机顺序控制器的区别
随机顺序控制器:该控制器下的子节点全部执行,但顺序是随机的。
随机控制器:该控制器下的子节点在执行中,是随机读取某一个执行的,并不是全部执行。

七、仅一次控制器

Once only Controller控制器一般用在只需要执行一次的场景中,例如登录查询订单场景,登录请求只需要执行一次,查询订单循环执行时,可将登录请求放在Once only Controller控制器下面。
1)、线程组设置了循环多次,仅一次控制器下的请求,只会执行一次
在这里插入图片描述在这里插入图片描述
2)、将“仅一次控制器”放置在指定要循环2次的循环控制器下,则“一次控制器”将仅在通过循环控制器的第一次迭代中执行(即每2次)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、吞吐量控制器

作用:控制其下的子节点的执行次数与负载比例分配

比如说有一种场景是,10个并发里,有2个事操作业务A,有8个是操作业务B,要模拟这种业务场景,则可以通过吞吐量控制器来模拟

吞吐量控制器允许用户控制执行的频率。有两种模式:

  • 执行百分比
  • 总执行次数

执行百分比
使控制器通过测试计划执行一定比例的迭代。
总执行次数
导致控制器在执行了一定数量的执行后停止执行。

1、用法
第一种:设置比例控制

选择percent executions选项,比如设置吞吐量占比80,表示在此吞吐量控制器下线程占总线程数的80%
在这里插入图片描述
第二种:设置线程数控制

选择total executions选项,比如设置吞吐量为6,表示在此吞吐量控制器下线程执行6次在这里插入图片描述另:底下的Per User表示该控制器下的线程执行总线程数次

2、举例
第一种:
第一步:添加吞吐量控制器,然后再添加请求
在这里插入图片描述在这里插入图片描述
第二步:设置占比

总线程数为10,“添加”这个请求占比80%,即执行8次,“登录”这个请求占比20%,即执行2次
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出结果:
在这里插入图片描述
第二种:

总线程数为10,“添加”这个请求7次,“登录”这个请求3次
在这里插入图片描述
在这里插入图片描述
出结果:
在这里插入图片描述
Per User:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出结果:
在这里插入图片描述

九、执行时间控制器(runtime Controller)

在这里插入图片描述

  • 根据输入的Runtime的值,对当前节点下的执行时长进行控制,当执行时长超过限定时长后,执行完当前正在执行的取样器后,跳出控制器,继续向下执行。
  • Runtime值为0及正整数(可使用变量代替)时,按照限定时长控制执行时长。0表示没有运行。
  • Runtime值为负数、小数及字符串时,都会直接跳过当前控制器,继续向下运行。
  • Runtime值为空时,时长会自动被填充为0。
  • Runtime值的单位为秒,不是毫秒!!!不是毫秒!!!不是毫秒!!!
  • 比如限定执行时长为5秒,控制器下有10个接口,每个接口间隔900毫秒,则应该是执行6个接口,是达到时间后,执行完当前正在执行的接口,而非立即跳出节点。

十、if控制器(If Controller)

在这里插入图片描述

范例(JavaScript)
$ {COUNT} <10
“ $ {VAR}==“ abcd”
如果在解释代码时出错,则假定条件为false,并且在jmeter.log中记录了一条消息。
请注意,建议避免使用JavaScript模式来提高性能。

使用__groovy时,请注意不要在字符串中使用变量替换,否则,如果使用更改了脚本的变量,则无法缓存。而是使用vars.get(“ myVar”)获取变量。 请参阅下面的Groovy示例。
实例(变量表达式)
$ {__ groovy(vars.get(“ myVar”)!=“ Invalid”)}(时髦检查myVar不等于Invalid)
$ {__ groovy(vars.get(“ myInt”)。toInteger()<= 4}(检查myInt小于或等于4)
$ {__ groovy(vars.get(“ myMissing”)!= null)}(仔细检查是否未设置myMissing变量)
$ {__ jexl3($ {COUNT} <10}
$ {RESULT}
$ {JMeterThread.last_sample_ok}(检查最后一个样本是否成功)
  • If Controller允许用户控制其下的测试元素(其子元素)是否运行。

  • 默认情况下,条件在初始输入时仅评估一次,但是您可以选择对控制器中包含的每个可运行元素进行评估。

使用if控制器有两种方式:
1.不勾选“interpret condition as variable expression”
直接输入我们需要判断的表达式即可,判断表达式为真时,执行if控制器下的请求,例如“1!=2”,则一定会执行下面的http请求
在这里插入图片描述

注意:
如果取消选中“Interpret Condition as Variable Expression?”,
if控制器 将在内部使用javascript评估条件,
则该条件可能会导致很大的性能损失,并使测试的可扩展性降低。
不推荐使用

2.勾选“interpret condition as variable expression”
这时expression中不能直接填写条件表达式,需要借助函数将条件表达式计算为true/false,可以借助的函数有_jexl3和_groovy,例如:直接填写${modelId}==5,是不能识别的

扩展
如果要测试上一个样本(sampler)是否成功(code=200),
则可以使用 ${JMeterThread.last_sample_ok} 

a.借助函数助手,生成表达式
在这里插入图片描述
b.把生成的表达式,写在if控制器中
在这里插入图片描述
c.然后if控制器就可以读取到判断内容啦,当条件为true时,执行下面的请求。

Expression 中使用变量的栗子
在这里插入图片描述
1、用户自定义变量
在这里插入图片描述
2、if 控制器
在这里插入图片描述
因为是字符串,所以要加双引号哦 “”

3、查看结果树
在这里插入图片描述

勾选 Evaluate for all children? 的栗子

1、线程组结构树
在这里插入图片描述
一共三个请求,第二个请求加了个后置处理器

2、用户自定义变量
在这里插入图片描述
3、if 控制器
在这里插入图片描述
因为是字符串,所以要加双引号哦 “”

4、JSR223 后置处理器在这里插入图片描述
5、查看结果树在这里插入图片描述

总结:
勾选了 Evaluate for all children? 意味着它的每个子元素在运行前都会运行一次 if 控制器里面的条件表达式,看看是否还是 true,是的话就可以运行,false 就不运行

十一、while控制器

While控制器将运行其子代,直到条件为“ false ”。
在这里插入图片描述
可能的条件值:

  • 不填(空):当 While 控制器下最后一个样例执行失败后 跳出循环

  • LAST :当 While 控制器下最后一个样例执行失败后 跳出循环,如果 While 控制器 前一个样例执行失败,则不会进入While循环,也就是不会执行While控制器下的样例。

  • 自定义条件:值为True 或 False的函数/变量/属性 表达式

Condition不填 (空)的栗子

1、新增一个While 控制器,在其下面添加3个样例,如下:
在这里插入图片描述
2、设置最后一个样例执行失败:(一定是最后一个样例哦)
在这里插入图片描述
3、执行结果: 执行后,发现 循环只跑了一遍就退出了。在这里插入图片描述

Condition为LAST的栗子

1、还是上面的设置不变,将While 控制器中的条件输入框中输入:LAST。
在这里插入图片描述
2、执行结果后,发现循环只跑一遍,与不填 的结果是一样的

3、但是输入LAST的时候,还会出现一个结果,那就是:如果While 控制器 的前一个样例执行失败,则不会进入While 控制器

如下:在While 控制器 前面 添加两个样例,使样例2 执行失败。
在这里插入图片描述
执行结果发现,样例1、样例2 执行了,但没有进入While 控制器:
在这里插入图片描述

Condition为自定义条件的栗子

1、Condition通过文件控制器
添加文件
在这里插入图片描述
同时在while控制器里添加CSV Data Set Config
在这里插入图片描述
在While控制器里添加条件在这里插入图片描述
当BooleanValue的值为False, 就跳出循环. 在这里插入图片描述
2、Condition使用函数(jexl3, groovy等函数)

调出函数助手, 添加变量myValue
在这里插入图片描述
设置while条件, 运行次数小于5在这里插入图片描述
同时在http_Sampler 添加运行次数赋值在这里插入图片描述
查看结果树在这里插入图片描述
从Debug Sample中可以清晰的确定myValue值等于5,与我们设置的value相符.

3、使用beanshell sampler

第一步,创建要给beanshell sampler 声明两个变量a,b 初始值设为1在这里插入图片描述
第二步,添加whileController,并设置循环条件,例如KaTeX parse error: Expected group after '_' at position 2: {_̲_javaScript({a}+${b}!=10)}在这里插入图片描述
在whileController中添加beanshell sampler ,每次循环a+1在这里插入图片描述
在结果树中可以看到最后一次的跳出循环之前的beanshell执行结果:在这里插入图片描述

a=8,a++后a=9,b=1,不满足循环条件后跳出循环

十二、switch控制器

该控制器可以控制他里面的请求根据某些规则在不同num时选择控制器下的对应数字位的不同sampler。一般可以用在模拟多线程同时操作不同请求的测试场景。
在这里插入图片描述
这个num可以通过计数器,counter函数,random函数来自动生成(一般常用random函数)。也可以通过CSV参数化文件来生成,切记数字数量不能大于请求数,但是这里有个特别的地方,0也是第一个,4也是第一个请求。所以要设置的话计数器要么是0-3,要么就是1-4

注意

  • 取得switch value的值,通过对节点下所有取样器、逻辑控制器的下标、名称匹配去执行,switch value的值可以为数字、字符串、变量等等

  • 当switch value的值为0和正整数时,只会对当前节点下的取样器、逻辑控制器的下标进行匹配,不会对名称匹配。<下标是从0开始,即0为第一个取样器/逻辑控制器>

  • 当switch value的值为空、为0、为正整数时,如果值超出了节点下的下标范围,则会默认执行节点下第一个取样器或逻辑控制器。

  • 当switch value的值为负数、小数、字符串时,如果无法通过名称匹配到取样器、逻辑控制器,则会跳过当前控制器。

  • 如果该值为非数字(且非空),则Switch Controller将查找具有相同名称的元素(大小写很重要)。如果没有名称匹配,则选择名为“ default ”(不重要)的元素。如果没有默认值,则不选择任何元素,控制器将不运行任何操作。

  • 当switch value的值通过名称匹配到多个结果时,只会按照正序执行第一个取样器、逻辑控制器。

十三、ForEach 控制器

ForEach控制器的作用:

  • 用来遍历每个数组的数据,相当于python的for循环;在用户自定义变量中读取一系列相关的变量,该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值,常和用户定义的变量使用
  • ForEach控制器一般和用户自定义变量一起使用,从用户自定义变量中读取一系列相关的变量。

例1:ForEach控制器结合用户自定义变量使用,遍历用户自定义变量

(1)添加配置元件-用户自定义变量如下图:在这里插入图片描述
(2)设置ForEach控制器如下图:在这里插入图片描述
(3)引用变量,引用变量的名称与ForEach控制器中输出变量名称一致在这里插入图片描述
(4)查看运行结果。在这里插入图片描述
由上图我们可以看出,用户自定义变量设置了3个值,遍历变量值执行了3次登录接口。

例2:从上面的取样器中提取的多个结果用ForEach控制器依次传参

本例是先登录,登录后请求当前登录用户的目前权限接口,从接口响应数据中获取有权限的子目录的url,并且请求每一个子目录。
(1)在查询目录权限接口添加后置处理器-正则表达式提取器,提取全部URL。如下图:在这里插入图片描述
(2)设置ForEach控制器如下图:在这里插入图片描述
(3)引用ForEach控制器的变量menu_url在这里插入图片描述
(4)运行并查看结果在这里插入图片描述
从上图中我们可以看出的运行的结果跟是一致的。

十四、模块控制器

在这里插入图片描述
同一个线程组中,有多个测试片段,只需通过模块控制器下拉框中选择适当的控制器,即可在这些多个测试用例之间轻松切换。
(1)模块控制器只选择登录模块,则只运行登录模块的测试片段
在这里插入图片描述
在这里插入图片描述
(2)模块控制器只选择充值模块,则只运行充值模块的测试片段
在这里插入图片描述
在这里插入图片描述

  • 若片段位于线程组中且可运行,则需要禁用其Controller以防止片段运行,模块控制器除外,否则会重复运行。

禁用前运行结果:
在这里插入图片描述
禁用后运行结果:
在这里插入图片描述
注意:被应用的模块位置不可随意变更,变更后会执行时出现提示引用失败`

可以将模块控制器与包括控制器一起学习比较,
模块控制器是从内部文件中引用,引用上相对比较灵活,可以只引用部分测试片段或模块内容,
包括控制器是从外部文件引用,只能引用整个测试片段的内容。

十五、include控制器

Include Controller :译为包含控制器,用来添加 Test Fragment(测试片段)。具体是什么意思呢,我们先来了解下 Test Fragment(测试片段)。
1、理解 Test Fragment(测试片段)

如下是创建一个 Test Fragment。
在这里插入图片描述
创建成功后,发现 Test Fragment 与线程组 处于同一个层级,而且默认是不启用的。如下图:

可以看到 Test Fragment 的设置界面除了名称和注释,没有其他设置项,那么它到底是干嘛用呢。选中 Test Fragment ,点击 Jmeter 菜单上的帮助(有问号的书图标),查看官方解释。

可知,Test Fragment 需要与 include Controller或者Module Controller配合使用,Test Fragment 作为一个测试片段 被引入。具体的我们来看看与 include Controller 的使用吧。在这里插入图片描述
2、认识 Include Controller

线程组下 添加 Include Controller ,在这里插入图片描述
设置界面如下,只有一个文件名设置项。在这里插入图片描述
既然要引入 测试计划文件,那么我们就先来创建一个单独的测试计划吧。

二、Include Controller 配合 Test Fragment 的使用

1、先创建一个单独的带有Test Fragment 的测试计划,并保存起来,如下在这里插入图片描述
2、在 include 控制中引入该 测试计划在这里插入图片描述
执行结果:在这里插入图片描述
到这里,大家应该理解了 Include Controller 和 Test Fragment 了吧。我的理解就是,Test Fragment 相当于一个独立的部分,可以被其他测试计划引用,实现了 样例的片段化,模块化,遇到重复需要的,比如登录、注册之类的,就可以用Test Fragment 和 Include Controller 了。

十六、事务控制器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值