JMETER(三) - Loginc Controller(逻辑控制器)
目录
Loop Controller
Once Only Controller
ForEach Controller
Transaction Controller
If Controller
While Controller
Runtime Controller
Jmeter中的逻辑控制器分为两类:一类是来控制测试计划执行过程中节点的逻辑执行顺序。如:Loop Controller、If Controller等,一类则与节点的逻辑执行顺序无关,用于对测试计划中的脚本进行分组,方便Jmeter统计执行结果以及进行脚本的的运行时控制,如:ThroughputController、TransactionsController.
注意:
更新后的内容,JMETER版本可能不一样
目前两个版本5.2,5.5
Loop Controller
循环控制器可以控制在其节点下的元件的执行次数。
如果在线程组中也设置了执行次数,那么循环控制器下的元件的执行次数是:线程组执行次数*循环控制器的执行次数。比如线程组设置执行3次,循环控制器设置执行次数6,总执行次数为18
参数说明:
- Loop Count:设置成Forever 或填写具体执行次数
应用场景:
一个用户登录系统成功后,一上午都在忙物流计划(plan)。模拟次业务过程登录一次后,然后就一直做物流计划,对plan可以设置Loop controller实现反复操作
Once Only Controller
一次控制器,也就是此控制器下的子元件只运行一次,即使把仅一次控制器放在循环控制器下面,也只能运行一次
应用场景:
在模拟请求时有时只需登录一次,就可以把登录的部分放在一次性控制器下
ForEach Controller
ForEach 控制器循环通过一组相关变量的值。当将采样器(或控制器)添加到 ForEach 控制器时,每个样本(或控制器)都会执行一次或多次,其中在每个循环期间变量都有一个新值
添加 :Right click on Thread Group->Add->Loginc Controller->ForEach Controller
参数说明
- Input variable prefix: 输入变量前缀,用作输入的变量名称的前缀。默认为空字符串作为前缀
- Start index for loop(exclusive): 循环变量开始的索引
- End index for loop: 循环变量结束的索引
- Output variable name: 输出变量名称
- Add “”before number?: 变量前缀后是否加“”作为分隔符
应用场景
在订单查询页面查询订单号,然后对每一条订单出库,此时需要遍历每一条订单,可以把订单号作为循环条件操作。
应用示例
- 第一个学生查询接口:返回多个学生ID,使用JSON Extractor 获取所有学生的studentId;
- 添加ForEach Controller,遍历上一个接口每个学生的studentId
- 将第二个“查询每个学生详情接口”添加到循环控制器中,然后通过${studentId}得到每个值
Transaction Controller
目录:
介绍
-
事务控制器生成一个额外的测量执行嵌套测试元素所花费的总时间的示例。
-
事务响应时间使我们衡量业务性能的主要指标,事务控制器可以把其节点下的取样器执行消耗的时间累加在一起 便于我们统计。同时我们对每一个取样器的执行时间进行统计。
-
如果事务控制器下的取样器有多个,那么只有每一个取样器都运行成功了,整个事务控制器定义的事务才算成功,这是充分必要的条件。
事务控制器将为我们提供其中所有内容(我们的两个采样器)的执行时间,合并为一个“事务”。
参数说明
- Generate Parent sample: 生成父样本 (如果选中,则样本将生成为其他样本的父样本, 否则,样本将作为独立样本生成。)
- Include duration of timer and pre-post processors in generated sample:在生成的样本中包括定时器和后置处理器的持续时间 (是否在生成的样本中包含计时器、预处理和后处理延迟。)
示例
首先创建一个JMeter脚本,简单几个步骤:
-
创建单个线程
-
单个事务控制器
-
两个HTTP请求采样器
-
添加查看结果树
将两个HTTP请求采样器放在事务控制器中,为每个采样器指定一个唯一名称用于区分,如下所示:
事务控制器将为我们提供其中所有内容(我们的两个采样器)的执行时间,合并为一个“事务”。
示例1:无父样本
不勾选Generate Parent sample
保存测试计划,然后在执行测试时观察“查看结果树”。注意我们的两个采样器的显示方式:
以上结果可以看到: 实际有两个采样器,但是显示了三个标签,其中第三个是“父样本”即事务控制器本身。
已经禁用了“生成父样本”,为什么还会出现父样本?这块的父样本显示为额外的普通采样器,而不是实际的父样本。
查看聚合报告显示的方式:
与查看结果树一样,显示三个标签,第三个标签是事务控制器本身。
JMETER文档描述中说明:
“事务控制器生成一个额外的样本,用于测量执行嵌套测试元素所花费的总时间。
测试是围绕以下两个方面生成:
- 一个是事务控制器节点下的各项内容(如:HTTP Request_1、HTTP Request_2)
- 另一个是两个请求标签的组合,也就是从头到尾的交易,显示为第三项
结论:如果不启用父样本,则将报告整个事务和事务各项请求的指标。
示例2:启用生成父样本
勾选Generate Parent sample
脚本其他保持不变,执行测试计划,观察“查看结果树”:
只显示一个标签,点击展开显示:
启用“Generate parent sample”选项后,查看树结果只显示一个标签,它下面显示两个采样器。
父采样器显示为包含子采样器,因此如果选中“Generate parent sample”,就意味着父样本将作为父样本出现在报告中,而不是单独的第三个标签。
查看聚合报告中显示:
在报告中只显示一个标签,报告只显示合并事务的运行指标,不会报告每个标签的详细信息。
结论:生成父样本仅针对事务控制器的组合内容报告,而不是报告各个内容的指标。
其他方面
是否要生成父样本取决于要为报告包含或排除的内容。在考虑时,请记住以下几点:
-
如果脚本具有许多事务控制器,则生成父样本有助于整理报表,每个事务控制器中都有许多采样器。
-
生成父样本可能会使调试变得困难,例如:一个采样器失败,整个事务控制器会失败,因为事务控制下是每个单独的请求,这样不会指出哪个采样器失败了。因此禁用“生成父样本”有利于识别故障。
If Controller
目录:
- 什么是If Controller
- 如何配置If Controller
- 如何使用If Controller
1.什么是If Controller
If Controller根据特定的条件,判断是否运行控制器下方的子采样器。
2.如何配置If Controller
参数说明
-
Expression (must evaluate to true or false): 表达式(计算结果必须是true或false),由执行流验证的条件,用于决定是否应执行子元素。默认情况下,条件被解释为返回“ true ”或“ false ”的JavaScript代码,但这可以被覆盖(见下文)
-
Interpret Condition as Variable Expression?: 将条件理解为为表达式。默认方法将指定的条件理解为 Javascript 代码,然后验证结果是true 还是 false。如果选择此项,则条件必须是计算结果为“true”的表达式(忽略大小写)。仅检查条件是否匹配“TRUE”(忽略大小写)。但是如果你选择这个参数,那么不会使用Javascript解释,并且条件将被视为JMeter变量。
-
Evaluate for all children: 判断条件是否针对所有的子节点。如果不勾选,只在if controller入口执行一次。
3.如何使用If Controller
示例1:控制脚本执行流程
If Controller主要用于控制执行脚本是否执行。只有当某个条件为真时才能运行该采样器。设置脚本:
- 设置两个采样器脚本
- 第一个在If Controller 外面,第二个在If Controller里面
- 配置If Controller 条件作为变量表达式,结果为真
运行测试脚本,结果如下:
如上图所示:运行结果显示两个请求。 当条件为设置为false(1==2)时,查看运行结果:
如上图所示条件为false,不会执行第二个请求。
如果有多个请求时,想阻止某个请求暂时不运行,添加If Controller并将条件设置为false。
示例2:实际操作运用
假设有两个请求脚本,第一个脚本在控制器外面,第二个脚本在控制器里面。当第一个脚本运行结果正确,才能执行第二个脚本,操作如下:
假设第一个脚本返回的结果是“用户未登录”(运行结果不正确)。
- 添加两个测试脚本,假设第一个脚本返回的结果是“用户未登录”(运行结果不正确)。
- 在第一个脚本下,运用JSON Extractor,获取响应结果code;
- 将第2个脚本放在If Controller下面;
- 在If Controller里,添加表达式,判断code的值是否等于000422,如果为true,则不执行下面请求。(这里的结果为真,判断的是用户未登录,Code与返回结果相等,说明用户未登录)
获取上一个接口的返回结果:
在If Controller中 设置条件表达式:
Examples (Variable Expression):
-
${__groovy(vars.get("myVar") != "Invalid" )} (Groovy 检查 myVar 不等于 Invalid)
-
${__groovy(vars.get("myInt").toInteger() <=4 )} (Groovy 检查 myInt 是否小于或等于 4)
-
${__groovy(vars.get("myMissing") != null )} (Groovy 检查 myMissing 变量是否未设置)
-
${__jexl3(${COUNT} < 10)}
-
${JMeterThread.last_sample_ok} (检查最后一个样本是否成功)
vars.get("myVar"),myVar是用户自定义的变量,如上述测试接口1返回code,code作为变量,可通过vars.get("code")获取到该变量的值用于表达式中。
While Controller
目录:
1.什么是While Controller
2.如何使用While Controller
1.什么是While Controller
While Controller运行其子项,直到条件为“false”时,停止运行。
可能的条件值:
-
blank - 当循环中的最后一个样本失败时,While控制器退出循环
-
LAST - 与 blank相同,但是循环结果之前对最后一个样本进行额外检查,如果循环前的样本不成功,则不会执行While控制器及其子控制器。
-
Otherwise - 当 条件 等于字符串“false ”时退出(或不进入)循环,条件可以是JMeter 任何函数或变量
条件控制器,其节点下的元件将一直运行到while条件为false。
参数
Condition (function or variable):条件(函数或变量),blank\LAST\变量或函数
2.如何使用While Controller
While Controller中使用函数
Runtime Controller
1.什么是Runtime Controller
Runtime 控制器:控制其子级将运行多长时间。直到超过配置的运行时间。
参数
- Runtime(seconds):默认为1,去掉1默认为0,为0时不执行其节点下的元件。
示例
- 添加一个Runtime Controller,设置时间2s
- 将采样器放在控制器下面
运行脚本后查看结果,运行2s后结束:
应用场景
当系统稳定时,有多个用户不停的向系统发送请求时,运行该控制器检查系统稳定性,查看是否出现异常。