python\java等后端编程语言,可以用if-else\for\while等语句来控制代码的执行顺序,Jmeter给我们提供了更加简单的方法,即是各个现成的逻辑控制器,使用它们即可按需控制采样器的执行顺序。
注意:控制器必须和采样器(Sampler)一起使用,放在控制器下的所有采样器会被看成一个整体,一起执行。
工作中最常用的Jmter的逻辑控制器
1、简单控制器
大部分只做容器用,不改变其下接口的执行顺序。里面可以嵌套其他控制器
2、仅一次控制器
其下子元件只运行一次,多用于登录后作其他循环操作时,将登录放在仅一次控制器里。
3、if控制器
根据条件决定是否执行其下的接口。 公式:${__jexl3(条件表达式)}
即如果括号里的条件表达式成立,则执行里面的接口,不成立,就不执行 。
4、ForEach 控制器
定义一个循环规则,往往需要跟列表一起使用。在列表里查出多个数据,然后将数据长度作为循环次数。
5、循环控制器
手动设置循环次数,直接写死数字。并且所填的循环次数会与线程组设置的循环次数 相乘,即如果线程组循环2次,此循环控制器设置循环5次,则其下的接口会执行10次。
一、简单控制器
Simple Controller用来指定了一个执行单元,它不改变元件的执行顺序,在它下面还可以嵌套其他控制器,很多时候只是做了一个容器
二、仅一次控制器
Once Only Controller 控制器下的子元件只运行一次,即使把一次控制器放在循环控制器下面,也只是运行一次。
使用场景:
比如说针对一个后台管理系统,管理员登录后新增20个员工,那么新增接口需要循环执行20次,如果没有把登录接口放在仅一次控制器里,则每一次新增都需要登录一次,不符合常理。
第一步:`线程组=>逻辑控制器 => 仅一次控制器
第二步:`在仅一次控制器右键添加HTTP取样器,登录接口。这个接口在整个系统里,不管其他接口循环多少次,它都仅执行一次
三、IF控制器
IF Controller根据给定表达式的值决定是否执行该节点下的子节点,条件格式:${__jexl3(条件表达式)}
使用场景:
如果登录接口返回参数errno=0,执行用户信息接口,否则不执行。
第一步:`右键登录接口 => 后置处理器 => JSON 提取器
第二步:` 点击“选项”=> 函数助手 => 选择函数“__jexl3”=>引用变量名“login_judge”
获得函数: ${__jexl3(${login_judge},)}
最终函数: ${__jexl3(${login_judge}==0,)} (判断的条件为字符串需要加"")
第三步: 在(if)控制器下添加用户信息接口,然后判断登录接口的.errno==0,所以执行个人信息
接口
如果将条件改成:.errno==1,然后执行,发现这个条件不成立,则不会执行个人信息接口。
四、ForEach控制器
ForEach Controller该控制器下的取样器或控制器都会被执行一次或多次,每次读取不同的变量值
使用场景:
比如说有一个网站,有一个资讯列表,查出所有状态为正常的资讯,然后将它们禁用。
第一步:`在资讯列表查询接口按查询条件“状态=正常”来查出所有资讯,得到一个列表。
第二步:` 使用正则表达式将所有列表都提取出来:如下图所示,匹配数字为-1时会将列表所有内容都提取出来
第三步:` 建一个ForEach控制器:
第四步:` 在控制器里添加禁用资讯的接口:id引用的是控制器的输出变量名称,将状态从1改成0
第五步:`执行:如下图所示,查询接口查出来总共20条数据,然后ForEach控制器就执行了20次
五、循环控制器
Loop Controller 控制其节点下的元件的执行次数。
使用场景:
比如说有一个网站,有一个底部文章管理菜单:需要新增10个文章类型。
分析:可以直接执行10次底部文章的新增接口,或使用循环控制器设置循环10次,还可以在线程组那里设置循环2次,循环控制器设置循环5次。
第一步:`线程组设置循环次数为2,线程组=>逻辑控制器 => 循环控制器,循环5次。
第二步:` 在循环控制器右键添加HTTP取样器,新增底部文章接口。这个接口将会循环10次
第三步: `执行,查看结果树。