Logic Controller (逻辑控制器)
ps:以当前版本5.1.1为例
1. If Controller
if控制器,顾名思义,就是条件+执行内容。当满足设定的条件就执行其下的内容。
控制器下可以添加诸如http request sample等元件。
如图,我在一个事务控制器中加入了三个if逻辑控制器,每个if控制器下都有一个http请求。 图中${if1}是第一个if控制器的变量名,他的值一定是true或false,默认是true。
然后,我在beanshell sample中,先把三个if控制器都置为false,保证他们不会被执行。
然后利用随机数函数,根据随机数的范围绝对执行其中一个请求,再通过vars.put赋值为true。
2. Transaction Controller
事务控制器。如果你需要统计一系列事务所花费的总时间或者执行的样本数量,可以添加一个事务控制器,然后在里面再添加其他内容。这样,在结果树统计的时候,显示的事务控制器的时间,即是其下内部事务花费的总时间。
从功能上来说,不具备什么特殊功能。
Generate Parent Sample:默认不勾选,如果勾选,则其下样本在结果树中不会单独作为一项来展示,只会统筹到Transaction Controller下。
Include duration of timer and pre-post processors in generated sample:默认不勾选,如果勾选,会把事务控制器下的计时器,前置处理器和后置处理器消耗的时间也算到事务控制器上。一般不勾选。
如图所示,下面的三个http请求执行数量加起来刚好是100,当脚本写的复杂的时候,用的比较多。
3. Loop Controller
loop,循环控制器,字面上就够清晰了。看下界面。
简介明了,只有一个选项,看样子有点类似于线程组上的loop count。 那先设个100次吧。
接下来,我们线程组设置为1,次数为1,然后在loop controller下加一个访问百度的http request sample。
执行以下,看下结果树
可以看到,虽然我们只有一个线程,次数为1,但是请求却执行了100次。
假设loop controller的次数设置为X,可以理解为,线程组设置的次数针对的对象是这个loop controller的执行,而对控制器本身而言:每当loop controller被执行一次,其下的内容就执行了X次。
4. While Controller
while控制器,也可以作用域循环的,不过他是带条件的。
只有一处填写,可以写变量或者写表达式。跟开发语言中的while是类似的,直到条件为false的时候,停止执行。
尝试下,新建一个while controller ,在下面新建一个计数器,一个http请求,一个结果查看树。
计数器,从1开始,每次递增1,最大100,返回变量名为num。
在while控制器中使用这个num, 设定条件,当num<5,执行http。当num=5的时候,执行http后停止整个循环。
类似于python里这样的效果。
1 | i=1 |
结果
可能有人会问,为什么还会有http request-5,避免混淆,强调下,这里什么时候跳出,是while controller做的判断,在while内部,是从4先递增到5,执行完http request-5,然后回到while的条件判断,发现5<5不成立,while循环结束。
5. ForEach Controller
foreach也是一种循环控制器。
Input Variable Prefix:输入变量前缀
Start index for loop(exclusive):循环开始的索引(默认从1开始,如果没有1开始的变量,执行时会报错)
End index for loop(inclusive):循环结束的索引
Output variable name:输出变量名称
Add””before number:输入变量名称中是否使用“”进行间隔
foreach接收的入参可以从User Defined Variables定义,一般结合正则提取器使用。
这里简单介绍下,使用User Defined Variables说明,新建个User Defined Variables,定义几个参数。
foreach controller中设置下,从索引从0开始,入参为${num},输出变量名${test_foreach}
添加个BeanShell Sample
执行
可以看到,四个test_格式的变量都被打印出来了,foreach控制器自己会遍历查找已定义的且格式符合的变量。
6. Interleave Controkker
交替控制器,针对对象是线程数和交替控制器下面的元件。
每个线程用户仅执行一次控制器内的请求,线程用户依据循环的次数请求控制器中的请求数。
Ignore sub-controller blocks:忽略子控制器,建议不勾选,当前版本目前有未知BUG
Interleave across threads:这个勾选后,先按顺序,带入循环次数执行,后面每个线程紧接着所在位置继续向下执行。
关于交替执行的概念,举个例子。
线程数3,循环5次,5个接口。
那么一共会执行多少个请求 ? 每个线程执行五次,循环五次,答案是355=75。
如果放到Interleave across threads里。
执行了,15次。而且看下顺序,他是每个接口,每个线程都执行一遍,然后到下一个接口的。
可以理解为
1 | for i in 接口list: |
而当勾选Interleave across threads后,次数依然是15,顺序变了。
可以这么理解,3个线程,循环5个接口。
第一次,按顺序排,三个线程第一次访问分别是接口1,2,3。然后按循环次数让后算。
线程1:接口1,2,3,4,5
线程2:接口2,3,4,5,1
线程3:接口3,4,5,1,2
7. Once Only Controller
仅一次控制器,比较简单,没有什么需要配置的,只需要注意一点,这个仅一次在表现形式上可能并非只执行了一次,因为他的作用对象是线程数,一个线程,在一次执行中只会跑一次。例如持续压测10分钟,200个用户,这200个用户都且只会一次 该控制器下的内容。 但是其他内容会持续执行直到时间截至。
8. Random Controller
这个也比较简单,没什么需要配置的地方。作用是随机执行控制器的下子节点内容。
9. Random Order Controller
同样是随机执行其下的子节点内容,和random controller不同点在于,该控制器会将其下的所有内容都执行一遍,但是顺序随机。
10. Runtime Controller
该控制器,可以控制下面内容的执行时间。
Runtime(seconds)默认1,如果设置为0就不会执行。
这边配置之后,假如下面只有一个请求,线程数1,循环次数1。
但是其下的内容会在1秒内尽可能多的执行。
如图所示,该请求在1S内执行了21次。
11. Simple Controller
简单控制器是最简单的控制器,本身没有什么逻辑作用,只是说可以让你的各个元件,在结构上更好的组织起来。
12. Module Controller
module控制器可以理解为调用,从整个测试计划中查找使用了逻辑控制器的地方。
可以看到,第一和第三个线程组里没有使用到逻辑控制器,在module controller中也没展开项。
另外,即便disable,在module controller也是可以调用的。
13. Switch Controller
这个也很简单,参考开发语言中的switch case用法。
只有一个设置switch value,可以直接写下面请求的name,或者通过数值表示,从0开始。
例如设为1
可以看到,按顺序排下来,执行的是第二个请求:请求2。