JMeter-逻辑控制器

本文详细介绍了JMeter的各种逻辑控制器,包括简单控制器、循环控制器、仅一次控制器、交替控制器、随机控制器、随机顺序控制器、If控制器、While Controller、Switch Controller、ForEach控制器、模块控制器和Include Controller。这些控制器用于控制Sampler执行顺序,如循环执行、条件执行、随机执行等,是JMeter测试计划的重要组成部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逻辑控制器


用于控制Samlper执行顺序。
这里写图片描述


1. 简单控制器

简单控制器用来存放组件的,没有提供什么逻辑功能。打个比方有点像是windows下的文件夹。
这里写图片描述
(我经常是用来控制组件的执行边界,比如HTTP信息头管理器)

2. 循环控制器

用来循环执行请求,可以配置循环次数。注意它与线程组、测试计划中的循环是相互独立的,比如在线程组中设置循环2次,循环控制器设置循环3次,最终循环控制器下的请求会执行2 * 3 = 6 次
这里写图片描述

循环次数:整数,勾选“永远”表示控制器下的请求会一直执行。输入-1等同选择“永远”

3. 仅一次控制器

仅一次控制器下的请求在每个线程中只会执行一次,而不管这个仅一次控制器本身会被循环执行多少次。
这里写图片描述
(注意是每个线程中执行一次,而不是每个线程组中执行一次)

4. 交替控制器

在每个循环中交替执行在控制器下的请求。
这里写图片描述

  • 忽略子控制器块:勾选的话,如果交替控制器下还有其他逻辑控制器比如循环控制器会也被忽略,最张每个循环中执行一个请求(“忽略资控制器块”这是个bug。。。,英文是“ignore sub-controller blocks”)
    比如:交替控制器下的循环控制器设置循环3 次,并勾选“忽略子控制器块”
    这里写图片描述
    结果:交替控制器被循环执行3次后,每次只执行一个请求,等于是没有循环控制器了(被忽略了)
    这里写图片描述
  • Interleave accross threads:跨线程交替,勾选的话,在多线程时也会交替执行
    比如:设置2个线程,循环次数为1,勾选Interleave accross threads
    这里写图片描述
    结果:交替控制器下的2个请求会交替执行
    这里写图片描述

5. 随机控制器

每将随机执行一个控制器下的请求
这里写图片描述

忽略子控制器块:勾选的话,会忽略随机控制器的其他逻辑控制器(参照交替控制器参数。。)

6. 随机顺序控制器

与简单控制器类似,但在随机顺序控制器下的请求执行顺序是随机的,每个请求最多执行一次(简单控制器是按顺序执行的)
这里写图片描述

7. 如果(If)控制器

必须符合配置的条件才会执行控制器下的请求
这里写图片描述

  • 条件
    默认是Javascript解释的表达式,返回值为 true 或 false。也可以使用变量、函数,只要返回值是true 或 false。(比如${JMeterThread.last_sample_ok}用于判断上一个请求是否成功)
  • Interpret Condition as Variable Expression?
    如果勾选的话,条件只能是一个值为ture的变量或函数表达式(比如只能是 isOktrue使 {age}> 10这些,在性能方面会有帮助,因为这时jmeter只会检查它的返回值是否为ture,其他情况会被忽略)
  • Evaluate for all children?
    是否在执行控制器下的每个请求之前都对条件进行判断。一般在条件会被控制器下的子请求修改时才会用到。
    比如,条件是age<10,但在 BeanShell Sampler中,age值被修改为了30,结果到执行HTTP请求1时,进行条件 age < 10 判断,值是 false,HTTP请求1就不会被执行
    这里写图片描述
    这里写图片描述

8. While Controller

循环控制器,直到条件判断失败时才会停止执行请求
这里写图片描述

Condition(条件):空、LAST、表达式

  • :当控制器中的某个请求失败时,跳出循环
  • LAST: 当控制器中的某个请求失败时,跳出循环。但如果在控制器前面的请求失败时,则不会进入循环
  • 表达式:当表达式返回值为true时循环继续,false则跳出循环

9. Switch Controller

在控制器下选择执行一个请求
这里写图片描述

Switch Value: 整数或字符串

  • 整数:由0开始,执行对应顺序的请求。比如值为0,执行的是第1个请求,值为1执行的是第2个请求。默认值(为空时)是0。
    当输入值越界时,会执行第一个请求。比如有3个请求,输入值为4(想执行第5个请求),结果执行的是值为0的第一个请求。
  • 字符串:当输入非数字的字符串时,会执行对应名称的请求。比如输入“HTTP请求 1”,结果会执行HTTP请求 1;如果找不到对应名字的请求,则不执行任何请求。

10. ForEach控制器

按变量名称执行控制器下的请求一次或多次。
这里写图片描述

变量名称必须以数字结尾的
比如有一组变量:a_1 = a1, a_2 = a2
输入变量前辍:变量名称中分隔符之前的字符串

  • Start index for loop(exclusive): 开始读取的位置,不包括设置值。比如设置为0,实际是从1开始的
  • End index for loop(inclusive): 结束读取的位置,包括设置值
  • 输出变量名称:新的变量,每次循环得到的变量值都会保存到这个新的变量中
  • Add “_” before number?:分隔符,勾选的话,读取的变量名称格式必须是var_1这样的。(不选择的话就必须是var1这样的)

比如:
这里写图片描述
结果,循环了2次,分别读取了a_1, a_2的值保存到了变量a中:
这里写图片描述

11. 模块控制器

用来执行测试计划中的Test Fragment
模块控制器中会显示所有的组件。
Test Fragment可以有多个,不要重名。
模块控制器会执行选中的那一个组件(只能单选)。
模块控制器不支持远程模式,不支持命令行
这里写图片描述
(将多个测试脚本时在封装到一个测试计划的不同的Test Fragment中,这样可以通过模块控制器来快速控制要执行哪一个测试脚本。呃,这只是我猜测的一个应用场景而已,不太明白模块控制器的好处在哪,或者是用来方便调试Test Fragment?)

12. Include Controller

用来引入外部脚本的。
使用方法:创建一个新的测试计划,添加Test Fragment,在Test Fragment添加需要的组件(比如请求什么的),并保存为一个新脚本:login.jmx
在目标脚本中,添加Include Controller,并选择这个新脚本login.jmx, 就可以在目标脚本中执行login.jmx中定义好的步骤了
这里写图片描述

  • 注1:文件名中不支持变量或函数
  • 注2:Include Controller的文件名可分为2部分:路径+脚本名称,而路径可以在jmeter的includecontroller.prefix属性中进行设置
    比如在user.properties中添加:
    这里写图片描述
    然后在Include Controller中,”文件名“只需要指脚本名称即可,jmeter会自动从设置的路径中查找对应的脚本。如果查找不到脚本,jmeter会弹框报错
  • 注3:在未设置includecontroller.prefix属性时,jmeter默认路径为 ${jmeter_home}/bin;另外,当设置includecontroller.prefix属性后,通过”浏览“按钮选择脚本的话,会带上路径,这里需要手动去掉路径,不然jmeter会拼接路径并最终报错。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值