如何在For Each Controller中传递id与对应price等多组匹配参数?
解决方法
你当前用的For Each控制器只能遍历单组序列变量,无法同步匹配两组对应变量的索引,推荐用以下两种方案实现需求:
方案1:直接复用之前线程提取的id、price变量(无需读取本地文件)
你之前提取id时会生成id_1、id_2...id_N格式的序列变量,提取price时同理生成price_1、price_2...price_N的序列,两组变量同索引值天然配对,按以下步骤调整即可:
- 替换原
For Each控制器为循环控制器,循环次数设置为${id_matchNr}(id_matchNr是JMeter提取器自动生成的变量,代表提取到的id总个数) - 在循环控制器下新增用户参数前置处理器,添加两个自定义变量:
current_id:值为${__V(id_${__intSum(${__jm__循环控制器__idx},1,)})}current_price:值为${__V(price_${__intSum(${__jm__循环控制器__idx},1,)})}
注:如果你的循环控制器自定义了名称,需要把上面表达式里的
循环控制器替换为你自己的控制器名称 - 直接在GraphQL请求的变量区域引用
${current_id}和${current_price}即可,两组值完全一一对应。
方案2:从已保存的本地文本文件读取配对数据
如果你需要用已经导出的id:price文本文件作为数据源,调整BeanShell采样器逻辑即可:
- 把原BeanShell采样器的代码替换为以下内容,读取文件后拆分id和price为配对的序列变量:
import java.io.BufferedReader; import java.io.FileReader; int index = 1; // 替换为你自己的文本文件绝对路径 BufferedReader br = new BufferedReader(new FileReader("D:/test/id_price.txt")); String line; while ((line = br.readLine()) != null) { line = line.trim(); if(line.isEmpty()) continue; // 按冒号拆分每行内容,最多拆分为2段避免price里包含冒号的情况 String[] parts = line.split(":",2); vars.put("id_"+index, parts[0].trim()); vars.put("price_"+index, parts[1].trim()); index++; } br.close(); // 存储总数据条数 vars.put("totalCount", String.valueOf(index-1));
注:JMeter 3.1及以上版本推荐把BeanShell采样器替换为JSR223采样器,选择groovy语言,执行效率更高。
- 后续步骤和方案1一致:循环控制器的循环次数设置为
${totalCount},再通过用户参数配对取值即可。
内容的提问来源于stack exchange,提问作者Shankar PK
相关产品推荐
相关产品推荐

