Jmeter之 forEach 遍历所有值

这篇博客介绍了如何在JMeter中通过正则表达式提取多个值,并将这些值保存到文件中。作者首先尝试了使用后置Beanshell断言,但遇到问题。然后改为使用循环结构配合 Beanshell 编写代码实现,虽然功能达成,但灵活性不足。最后,作者采用ForEach控制器来遍历并保存数据,成功实现了动态提取和保存,且文件数据正确。

今天遇到一个场景,通过正则表达式提取多个值,然后保存到文件中去

正则表达式image

1、一开始的思路是通过后置 Beanshell断言进行,得到文件数据为 null
FileWriter fstream=new FileWriter ("D://test.csv",true);
BufferedWriter out=new BufferedWriter(fstream);
out.write(vars.get("type")+"\n");
out.close();
fstream.close();
2、修改 beanshell 代码
FileWriter fstream=new FileWriter ("D://test.csv",true);
BufferedWriter out=new BufferedWriter(fstream);

for(int num=1; num<=5; num++){
  //拼接变量名称
  type = "type"+"_"+num;
  System.out.println(type);

  //把拼接的名称赋值给 type_num
  vars.put("type",type);
  System.out.println(vars.get(type));

  //vars.get()获取到变量名称,并和上面返回的 type_num_(2,3,4,5,6)名称一致,取到变量的值
  out.write(vars.get(mipAccount)+"\n");
}

out.close();
fstream.close();

功能能实现,但是这个需要提前知道循环了多少次得到的数据才正确,不灵活

3、通过 forEach 控制器进行

image

  • forEach控制器设置
    名称:字面意思,ForEach Controller的名称
    注释:字面意思
    输入变量前缀:变量的前缀;如要使用的变量为name_1,则需要填name。
    Start index for loop(exclusive):从X-1号的变量开始,X为第几个变量;如填0,实际从第一个开始。
    End index for loop(inclusive):到X+1的变量结束,X为第几个变量;如填4,实际第4个不会被使用,只会到第3个。
    输出变量名称:将要用来使用的变量名,不填则循环所有值
    Add“_”before number?:用户定义的变量有没有下划线分隔编号,最好还是勾上比较方便标识;

image

  • 在forEach 下添加 Beanshell Sampler ,写上代码
FileWriter fstream=new FileWriter ("D://test.csv",true);
BufferedWriter out=new BufferedWriter(fstream);
out.write(vars.get("newType")+"\n");
out.close();
fstream.close();

执行jmeter脚本,检查保存的文件数据,数据正确image

JMeter 中,ForEach 控制器用于遍历变量集合,并对每个元素执行特定的操作。该控制器常用于处理动态数据,例如从响应中提取的多个并逐个进行测试或验证。 ### 基本使用方法 1. **准备变量集合** ForEach 控制器依赖于先前的提取操作,例如通过正则表达式提取器(Regular Expression Extractor)或 JSON 提取器获取一组变量。这些变量通常以数组形式存储,并具有相同的前缀名称。例如,提取了三个搜索关键字 `python`、`jmeter` 和 `软件测试`,JMeter 会生成如 `keyword_1`、`keyword_2`、`keyword_3` 的变量,并且变量 `keyword_matchNr` 表示匹配的数量[^2]。 2. **添加 ForEach 控制器** 在测试计划中,将 ForEach 控制器作为某个采样器的子节点,并设置以下参数: - **输入变量前缀**:指定需要遍历的变量前缀,例如 `keyword`。 - **输出变量名称**:定义一个新变量名,每次循环时,当前项的会被赋给该变量,例如 `currentKeyword`。 - **开始循环字段**:默认为 `1`,表示从第一个元素开始遍历。 - **结束循环字段**:默认为空,表示直到所有元素都被遍历为止。可以手动指定最大索引。 3. **在请求中引用变量** ForEach 控制器内部的 HTTP 请求或其他组件可以通过 `${currentKeyword}` 来访问当前遍历到的。例如,在百度搜索接口中构造如下 URL: ```text https://www.baidu.com/s?wd=${currentKeyword} ``` 4. **性能注意事项** 如果遍历的数据量非常大,可能会影响测试的执行时间和资源消耗。因此,在设计测试脚本时应权衡需求和性能影响,避免不必要的大规模遍历。 ### 示例场景 假设用户希望使用 ForEach 控制器依次搜索 `[python, jmeter, 软件测试]` 关键字,并在百度上执行搜索请求: - 首先,通过某种方式(如用户定义变量或前置处理器)定义 `keyword_1=python`, `keyword_2=jmeter`, `keyword_3=软件测试`,同时确保 `keyword_matchNr=3`。 - 添加 ForEach 控制器,配置输入变量前缀为 `keyword`,输出变量名称为 `currentKeyword`。 - 在 ForEach 控制器内添加 HTTP 请求,URL 设置为 `https://www.baidu.com/s?wd=${currentKeyword}`。 - 执行测试时,JMeter 将依次发送以下请求: - `https://www.baidu.com/s?wd=python` - `https://www.baidu.com/s?wd=jmeter` - `https://www.baidu.com/s?wd=软件测试` ### 变量命名规范的重要性 如果变量命名不符合一致的前缀规则,例如部分变量名为 `search_1`、`search_2`,而另一些为 `key_1`、`key_2`,那么 ForEach 控制器将无法正确识别并遍历它们。因此,保持变量命名的一致性是确保 ForEach 控制器正常工作的关键条件之一[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值