浅谈逻辑控制器之Switch控制器
Switch Controller是Apache JMeter中一个强大的逻辑控制器,它允许用户基于特定的变量值或参数来控制哪些子采样器被执行。与简单地按照配置顺序执行的控制器不同,Switch Controller根据提供的“switch value”来决定执行哪个子元素,这为测试计划提供了高度的灵活性和动态性。
工作原理
Switch Controller的工作机制类似于编程语言中的switch-case语句。它检查一个变量(或属性)的值,并基于这个值来选择执行哪一个子采样器或控制器。如果指定的值与任何一个子元素的名称匹配,则执行该元素;如果不匹配或值为空,则默认情况下不执行任何子元素。
配置步骤
- 添加Switch Controller: 在JMeter的测试计划中,右键点击需要放置Switch Controller的父级元素(如线程组),选择“添加” -> “逻辑控制器” -> “Switch Controller”。
- 设置Switch Value: 在Switch Controller属性中,可以设置一个变量名或直接提供一个值作为“Switch Value”。这个值通常来自于用户定义的变量、属性或者通过前置处理器(如User Defined Variables, Regular Expression Extractor等)提取的值。
- 添加子元素: 根据预期的Switch Value,为每个可能的值添加一个或多个子采样器或控制器,并命名这些子元素以匹配Switch Value。例如,如果Switch Value可能是"login", “search”, 或 “checkout”,则应创建相应命名的子采样器。
- 配置子元素: 对每个子元素进行具体配置,包括HTTP请求、定时器、断言等,以满足不同的测试场景需求。
应用实例
情况1:用索引进行业务区分
我们编写如下脚本
线程组:线程数设置为5,其他保持默认。
BeanShell 取样器:编写如下代码:
//通过函数助手使用Random函数获取一个随机值,数据从0-2
String s = "${__Random(0,2,)}";
//打印这个值
log.info("此次随机数据是:" + s);
//使用swithVal变量获取s的值,变成全局变量,方便后续switch控制器引用
vars.put("swithVal",s);
Switch控制器:Switch Value设置为${swithVal}
BeanShell 取样器1:编写如下代码:
log.info("test1");
BeanShell 取样器2:编写如下代码:
log.info("test2");
BeanShell 取样器3:编写如下代码:
log.info("test3");
执行脚本,我们查看JMeter日志如下
2024-06-28 16:58:57,293 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:0
2024-06-28 16:58:57,294 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-28 16:58:57,487 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:1
2024-06-28 16:58:57,489 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-28 16:58:57,681 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:1
2024-06-28 16:58:57,682 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-28 16:58:57,880 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:1
2024-06-28 16:58:57,881 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-28 16:58:58,081 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:2
2024-06-28 16:58:58,082 INFO o.a.j.u.BeanShellTestElement: test3
上述内容可以看到,随机值为0时,BeanShell 取样器1执行,随机值为1时,BeanShell 取样器2执行,随机值为2时,BeanShell 取样器3执行,所以Switch控制器下方的索引从0开始
情况2:用取样器名称进行业务区分
我们编写如下脚本
BeanShell 取样器:编写如下代码:
//通过函数助手使用Random函数获取一个随机值,数据从0-2
String s = "${__Random(0,2,)}";
//取样器名称组装
String sampName = "BeanShell 取样器" + s;
//打印这个值
log.info("此次随机数据是:" + sampName);
//使用swithVal变量获取s的值,变成全局变量,方便后续switch控制器引用
vars.put("swithVal",sampName);
其他设置跟情况1一致,执行脚本,我们查看JMeter日志如下
2024-06-28 17:11:26,541 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:BeanShell 取样器2
2024-06-28 17:11:26,542 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-28 17:11:26,770 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:BeanShell 取样器1
2024-06-28 17:11:26,772 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-28 17:11:26,933 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:BeanShell 取样器2
2024-06-28 17:11:26,934 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-28 17:11:27,131 INFO o.a.j.u.BeanShellTestElement: 此次随机数据是:BeanShell 取样器1
2024-06-28 17:11:27,131 INFO o.a.j.u.BeanShellTestElement: test1
上述内容可以看到,当前Switch Value的值为BeanShell 取样器1时,BeanShell 取样器1执行;当前Switch Value的值为BeanShell 取样器2时,BeanShell 取样器2执行;当前Switch Value的值为BeanShell 取样器3时,BeanShell 取样器3执行
注意事项
● 确保Switch Value所对应的变量或属性已被正确设置并可在执行时获取到。
● 如果没有子元素的名称与Switch Value匹配,Switch Controller默认不执行任何子元素。可以通过勾选“Default"选项并指定一个默认执行的子元素来改变这一行为。
● 使用变量时,注意变量作用域和生命周期,确保在Switch Controller评估时变量已有效赋值。
总结
Switch Controller为JMeter测试脚本提供了动态控制执行流程的能力,使得测试计划能够根据不同的条件灵活地执行不同的测试片段。通过合理利用Switch Controller,测试工程师可以构建更加复杂且适应性强的性能测试场景。