ApacheJmeter各Element介绍(三):循环控制器和while控制器

学习jmeter最好的方式还是去看官方方档

控制器(controllers)

Jmeter控制有两种控制器:逻辑控制器(Logical Controllers)和取样器(Samplers),Jmeter靠各种控制的组合来驱动测试

逻辑控制器

逻辑控制器让用户组织,控制虚拟用户的时间/顺序/次数等。逻辑控制器控制被其包裏的所有控制器

简单控制器

简单控制器,实际上没有任何作用,仅让测试人员组织其他控制器而已,如下图,将http-get-1、http-get-2分别放在No.1和No.2两个不同的简单控制器中和直接放在线程组下,在执行时没有任何区别(相当于C语言中直接使用一组大括号括出一个域{}的语句)。
简单控制器

循环控制器

循环控制器介绍

循环控制器可控制其所包裹的其他控制器的执行次数。循环次数由测试人员指出(相当于C语言中for (int loop=5; loop>0; --loop) {}的语句)。当线程组中只有某一个或某一些请求需要多次运行时,此时可以使用循环控制器。

如下图,图中http-get-1,在线程组的一个循环内,将会被执行5次。如果钩选“永远”(即loop=-1)循环控制器将按死循环运行。
循环控制器

这玩意有啥用

循环控制器特别适用于明确知道需要运行多次(注意:次数明确知道)的场景

while控制器

while控制器介绍

while控制器,同样是控制它包裹的其他控制器循环。但它条件接受一个变量或函数,直到指定的条件为false时停止。

while循环条件取值:

  1. 为空时:当循环中最后一个取样器失败时,退出
  2. 为字符串“LAST”时:当循环中最后一个取样器失败时,退出;但当while循环控制器前面一个采样器失败时,不会进入while循环
  3. 为变量或其他函数:变量或函数返回值为false时退出while循环

注意: while控制器和C语言中的while循环有些不同:jmeter while控制器条件会在进入循环后被检查一次,在循环语句完成后再被检查一次,一共检查两次,所以,如果条件中放入非幂等函数,可能会出错

使用C语言来模拟while控制器:

1
2
3
4
5
6
7
8
9
10
11
12
13
bool condition(){
//do somthing
return false;
}

while (condition()) {
//do somthing

//正常do-while循环不需要调用下面这个判断,模拟jmeter while控制器时
if (!condition()) {
break;
}
}

从上面伪代码中可以看出,每一个循环,都要检查两次condition,所以,condition为非幂等函数时请特别注意。

while控制器会通过一个变量来告诉我们当前循环次数,变量名规则为:__jm__控制器名字__idx,如下图,我们while控制器名字为“while1”,则变量名字是:${__jm__while1__idx}。循环次数从0开始计数。

whil控制器

按照上图配置,我们运行jmeter,从下图的日志可以看出一个循环内流程如下:

  1. 检查条件
  2. 请求百度
  3. 请求QQ
  4. 再检查一次条件

whil控制器流程日志

这玩意有啥用

While控制器比较适用于有循环运行需求,但是循环数数/条件是动态变化的、由其他接口或场景控制的状况。