浅谈逻辑控制器之while控制器

发布于:2024-06-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

浅谈逻辑控制器之while控制器

“While控制器”是一种高级控制结构,它允许用户基于特定条件来循环执行其下的子采样器或控制器,直至该条件不再满足。本文旨在详细介绍While控制器的功能、配置方法、使用场景以及实践示例,帮助测试工程师高效利用这一强大功能进行复杂的测试设计。

While控制器简介

While控制器是JMeter中的一种循环控制机制,与传统的“循环控制器”不同,它不是基于固定的迭代次数来决定循环的终止,而是根据一个可自定义的布尔表达式来动态决定是否继续执行循环内的操作。这意味着只要设定的条件为真(true),控制器就会持续执行其子元素。

配置与使用

设置条件表达式

在While控制器的属性设置中,需要提供一个条件表达式,该表达式基于JMeter函数、变量或任何返回布尔值的逻辑语句。例如,“${myVar}” != “finished” 表示只要变量 myVar 的值不等于 “finished”,循环就会继续,但是仅仅这样编写到while控制器中的逻辑是不会被判断的,不管是不是正确的都是循环,需要套一层函数,比如:${__jexl3(“${myVar}” != “finished”)},才会被判断。

后置处理器与变量管理

为了控制循环条件,经常需要结合后置处理器来更新循环控制变量的值。例如,使用“正则表达式提取器”从响应中提取数据并存储到变量中,然后在While控制器的条件表达式中引用这个变量。

使用场景

动态循环控制

当需要根据服务器响应动态决定测试流程时,如等待某个异步任务完成或检查数据更新状态,While控制器尤为有用。

负载模拟

模拟持续请求直到达到特定状态或条件,例如,不断查询任务状态直到任务完成。

错误处理与重试机制

可以用来实现错误处理逻辑,如在网络不稳定时重试请求,直到成功或达到最大尝试次数。

实践示例

我们编写如下脚本
在这里插入图片描述
线程组:设置默认
BeanShell 取样器1:编写如下代码

String s = "finished";
vars.put("val",s);
log.info(s);

BeanShell 取样器2:编写如下代码

log.info("test");

情况1:While控制器输入字符(如abc)、数字(如0、1)、汉字(如测试)

运行脚本,查看结果

2024-06-25 10:14:44,632 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-25 10:14:44,634 INFO o.a.j.u.BeanShellTestElement: finished
2024-06-25 10:14:44,635 INFO o.a.j.u.BeanShellTestElement: test
……

结论:当输入字符是判定为true

情况2:While控制器输入Boolean类,如true时

运行脚本,查看结果

2024-06-25 10:14:44,632 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-25 10:14:44,634 INFO o.a.j.u.BeanShellTestElement: finished
2024-06-25 10:14:44,635 INFO o.a.j.u.BeanShellTestElement: test
……

结论:当输入字符是判定为true

情况3:While控制器输入Boolean类,如false时

运行脚本,查看结果

2024-06-25 10:17:34,471 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-25 10:17:34,472 INFO o.a.j.u.BeanShellTestElement: finished
2024-06-25 10:17:34,473 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1

结论:当输入字符是判定为false

情况4:While控制器输入表达式是,如样例中表达式为:${__jexl3(“${val}” != “finished”)}

运行脚本,查看结果

2024-06-25 10:34:55,567 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-25 10:34:55,569 INFO o.a.j.u.BeanShellTestElement: finished
2024-06-25 10:34:55,569 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1

结论:当输入字符是判定为false

情况5:While控制器输入表达式是,如样例中表达式为:${__jexl3(“${val}” == “finished”)}

运行脚本,查看结果
2024-06-25 10:14:44,632 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-25 10:14:44,634 INFO o.a.j.u.BeanShellTestElement: finished
2024-06-25 10:14:44,635 INFO o.a.j.u.BeanShellTestElement: test
……

结论:当输入字符是判定为true

注意事项

● 防止无限循环:务必确保条件表达式最终能够变为假,避免测试脚本陷入无限循环。
● 性能考量:频繁的循环检查可能对测试资源造成压力,合理设置循环条件和超时机制。
● 变量作用域:注意变量的作用域,确保While控制器能够访问到所需变量。

结论

While控制器为JMeter提供了强大的循环控制能力,使得测试脚本能够更加灵活地适应各种动态测试需求。通过合理设计条件表达式和管理相关变量,测试工程师可以创建出高度自适应和高效的测试计划。


网站公告

今日签到

点亮在社区的每一天
去签到