7、逻辑控制器与定时器
逻辑控制器
逻辑控制器可以分为两类:控制取样器的执行顺序;对于脚本进行分组,方便统计结果
简单控制器
最基本的控制器,没有任何附加作用,不参与脚本运行,可以用来命名某些操作(如采样器等)
如果(If)控制器
目的:判断条件,可以引用变量。当为 true 时,执行子节点
Interpret Condition as Variable Expression?
如果选择了此项,则条件必须是一个表达式 ,需要使用 {__jexl3 } 或 {__groovy } 表达式)
Evaluate for all children
- 勾选:对所有采样器执行前都判断一次
- 不勾选:仅入口判断一次
注意事项:在if逻辑控制器的Expression中不能直接填写条件表达式 ,需要借助函数将条件表达式计算为true/false,可以借助的函数有**__jexl3和__groovy** 函数
如果是字符串的比较,需要加""
{__jexl3("{gender_1}"=="男",)}

表达式支持
- == 是否等于,如{__jexl3({VAR}==1,)},判断${VAR}变量是否等于1
- != 不等于,如{__jexl3({VAR}!=1,)},判断${VAR}变量是否不等于1
- ! 非,如{__jexl3(!({VAR}!=1),)}对${VAR}!=1的结果取反
- &&或|| 且与或,如 {__jexl3({VAR}==1 && "${name}"=="tom01",)}
- > 或者>== 大于等于,如{__jexl3({count}>=10,)}
循环控制器
目的:循环该控制器下面字节点的次数。
线程组里循环次数设置了n次,循环控制器下的循环次数也设置了m次,则该控制器下的请求运行的次数是(n*m)次
While控制器
目的:将一直运行其所有子项,直到条件为 false 为止
- Condition的可能值如下:
- 为空(不输入任何值) -- 直到循环体内最后一个sampler请求失败,才会退出循环
- LAST -- 直到循环前最后一个sampler请求失败,才会退出循环
- 其它 -- 条件值等同于字符串"false"(等同于输入框中输入false)时,退出循环
- Condition输入框的可以输入最终计算结果等同于"false"的变量、函数。这允许使用JavaScript, BeanShell, 属性(propertie) 或变量(variable)
ForEach控制器
目的:遍历变量值
- 一般和用户自定义变量(User Defined Variables)一起使用,其在用户自定义变量中读取一系列相关的变量。每一个线程下执行时该控制器下的采样器或控制器都会被执行一次或多次(次数和用户变量有关)。输入应包括的几个变量,每个变量由变量名、下划线、和数字组成,每个变量必须有一个值


交替控制器
每次循环时执行不同的请求

Switch 控制器
- 该控制器可以控制里面的请求根据某些规则,在不同数字时选择控制器下的对应数字位的不同sampler。一般可以用在模拟多线程同时操作不同请求的测试场景
- Switch Value:设置你要访问的请求索引(从0开始的)或者直接设置访问的请求名称。数字对应的就是每个请求的顺序(注意点:第一个是0),这个num可以通过计数器,counter函数,random函数来自动生成(一般常用random函数)
随机(顺序)控制器
- 随机控制器:其下属节点在执行中,是随机读取某一个执行的
- 随机顺序控制器:其下的子节点全部执行,但顺序是随机的
吞吐量控制器
- 目的:控制该控制器下面子节点运行次数
- Total Executions:吞吐量的次数
- Percent Executions:吞吐量占的百分比
事务控制器
- 目的:统计该控制器下面的子节点运行的时间
- 举例:在事务控制器下面创建两个http请求和"用表格查看结果"
- Generate parent sample,勾选上这一项后,只显示控制器下面所有子节点的总共的时间
- Include duration...generated sample:统计定时器等待的时间。如果你添加了定时器,然后勾选了这一项,则会将你定时器等待的时间也统计出来
定时器
定时器特点
- 负责定义请求之间的延迟间隔
- 定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是之后)
- 当执行一个sampler之前时,所有当前作用域内的定时器都会被执行
- 如果希望定时器仅应用于其中一个sampler,则把定时器作为子节点加入
固定定时器
如果需要让每个线程在请求之前按相同的指定时间停顿,那么可以使用这个定时器;需要注意的是,固定定时器的延时不会计入单个sampler的响应时间,但会计入事务控制器的时间
同步定时器(Synchronizing Timer)
- 类似于loadrunner当中的集合点(rendezvous point)作用相似,其作用是:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量
- Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数
函数的使用
函数助手
- 随机数 ${__Random(1,100,)} 配置元件/随机变量也可以产生随机数
- 时间 {__time(,)} {__time(yyyyMMdd-HH:mm:ss,)}
- 唯一数 ${__UUID}
- 计数器 ${__counter(TRUE,i)}线程迭代的次数

函数助手-计数器 ${__counter(TRUE,i)}
If控制器配合线程迭代计数函数( ${__counter(true,)} )来控制
实现每次调用计数器都会产生一个新值,从1开始每次累加1
- true:针对每个虚拟用户是独立的
- false:所有虚拟用户是公用的

- ${__counter(true,)}%5==0
- ${__counter(true,)}%2==0