浅谈逻辑控制器之ForEach控制器
ForEach控制器是一个非常实用的功能,它允许用户遍历某个变量的所有值,并为每个值执行控制器内的子采样器或逻辑。这对于处理从先前请求(如CSV Data Set Config、JSON Extractor、Regular Expression Extractor等)中提取的多个变量值特别有用。
简介
组件名称:ForEach Controller
功能:遍历指定的变量集合中的所有值,并为每个值独立执行一次控制器内的操作。
使用场景
- 数据驱动测试:当需要使用从响应中提取的一系列值来驱动后续请求时,例如遍历从一个列表中获取的所有用户ID进行登录测试。
- 结果处理:处理CSV文件或数据库查询返回的多行数据,对每一行数据执行相同的测试步骤。
- 参数化测试:动态地将一组变量值应用于同一测试场景的不同迭代中。
配置说明
在JMeter中添加ForEach控制器很简单,以下是配置步骤和关键参数解释:
- 右键点击测试计划、线程组或任何其他控制器,选择“添加” > “逻辑控制器” > “ForEach控制器”。
- 配置ForEach控制器:
○ 名称(Name):控制器的名称,用于标识。
○ 输入变量前缀(Input Variables Prefix):输入变量前缀。这是你希望遍历的变量的名称前缀。例如,如果你使用正则表达式提取器设置了变量名为userId_1、userId_2等。
○ 开始循环字段(不包含):循环的起始索引,通常情况下保持默认值0即可。
○ 结束循环字段(含):循环的结束索引(包含)。留空表示遍历所有匹配的变量值。
○ 输出变量名称(Output Variable Name):输出变量名。这是ForEach控制器为每次循环分配的新变量名,用于在控制器内部访问当前遍历到的值。
○ 数字之前加上下划线“”
示例说明
我们编写如下脚本
线程组:设置默认
BeanShell 取样器1:编写如下代码
String s1 = "test1";
String s2 = "test2";
String s3 = "test3";
String s4 = "test4";
String s5 = "test5";
String s6 = "test6";
vars.put("val1",s1);
vars.put("val2",s2);
vars.put("val3",s3);
vars.put("val_4",s4);
vars.put("val_5",s5);
vars.put("val_6",s6);
log.info(s1);
log.info(s2);
log.info(s3);
log.info(s4);
log.info(s5);
log.info(s6);
BeanShell 取样器2:编写如下代码
log.info("New val:${newVal}");
forEach控制器参数如下:
● 输入变量前缀:val
● 输出变量名称:newVal
情况1:开始循环字段和结束循环字段都为空,不勾选数字之前加上下划线"_"
运行脚本,查看结果
2024-06-25 12:04:03,414 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2024-06-25 12:04:03,416 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-25 12:04:03,416 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-25 12:04:03,417 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-25 12:04:03,419 INFO o.a.j.u.BeanShellTestElement: test4
2024-06-25 12:04:03,419 INFO o.a.j.u.BeanShellTestElement: test5
2024-06-25 12:04:03,420 INFO o.a.j.u.BeanShellTestElement: test6
2024-06-25 12:04:03,420 INFO o.a.j.u.BeanShellTestElement: New val:test1
2024-06-25 12:04:03,421 INFO o.a.j.u.BeanShellTestElement: New val:test2
2024-06-25 12:04:03,421 INFO o.a.j.u.BeanShellTestElement: New val:test3
2024-06-25 12:04:03,422 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
情况2:开始循环字段和结束循环字段都为空,勾选数字之前加上下划线"_"
运行脚本,查看结果
2024-06-25 12:04:39,283 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-25 12:04:39,283 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-25 12:04:39,283 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-25 12:04:39,283 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-25 12:04:39,283 INFO o.a.j.u.BeanShellTestElement: test4
2024-06-25 12:04:39,283 INFO o.a.j.u.BeanShellTestElement: test5
2024-06-25 12:04:39,283 INFO o.a.j.u.BeanShellTestElement: test6
2024-06-25 12:04:39,283 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
变量未进行识别
情况3:开始循环字段和结束循环字段分别为0和3,不勾选数字之前加上下划线"_"
运行脚本,查看结果
2024-06-25 12:05:48,968 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-25 12:05:48,970 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-25 12:05:48,974 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-25 12:05:48,974 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-25 12:05:48,975 INFO o.a.j.u.BeanShellTestElement: test4
2024-06-25 12:05:48,975 INFO o.a.j.u.BeanShellTestElement: test5
2024-06-25 12:05:48,975 INFO o.a.j.u.BeanShellTestElement: test6
2024-06-25 12:05:48,977 INFO o.a.j.u.BeanShellTestElement: New val:test1
2024-06-25 12:05:48,977 INFO o.a.j.u.BeanShellTestElement: New val:test2
2024-06-25 12:05:48,977 INFO o.a.j.u.BeanShellTestElement: New val:test3
2024-06-25 12:05:48,977 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
情况4:开始循环字段和结束循环字段分别为3和6,勾选数字之前加上下划线"_"
运行脚本,查看结果
2024-06-25 12:06:25,076 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: test4
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: test5
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: test6
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: New val:test4
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: New val:test5
2024-06-25 12:06:25,076 INFO o.a.j.u.BeanShellTestElement: New val:test6
2024-06-25 12:06:25,076 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
注意事项
● 确保在ForEach控制器之前正确设置了变量提取器,并且已经成功提取到了期望的变量值。
● 如果你的变量命名不遵循一致的前缀规则,ForEach控制器可能无法正确识别并遍历它们。
● 考虑到性能,如果遍历的变量数量非常大,可能会对测试执行时间和资源消耗产生影响。
通过合理利用ForEach控制器,可以极大地增强JMeter测试脚本的灵活性和效率,特别是在处理动态数据和复杂场景时。