逻辑控制器
用于控制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的变量或函数表达式(比如只能是 isOk这样值为true的变量,而不能使用条件表达式比如 {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会拼接路径并最终报错。)