JMeter中如何通过BeanShell在For Each控制器中获取JDBC查询结果的f_authority与username变量并用于HTTP请求
解决JMeter中For Each控制器同时获取JDBC多列变量的问题
嘿,我来帮你搞定这个JMeter的变量关联问题!你的需求是在For Each循环里同时拿到JDBC查询返回的f_authority和username,其实核心是要利用JMeter JDBC请求自动生成的带索引变量,再结合For Each控制器或者BeanShell来关联对应行的数据。
方法一:直接通过For Each控制器的索引关联两列变量
当你执行JDBC查询后,JMeter会自动为每一列生成带索引的变量,比如:
- 对于
username列:username_1、username_2、username_3(对应你的3条数据),还有username_#存储总条数 - 对于
f_authority列:f_authority_1、f_authority_2、f_authority_3,以及f_authority_#
你只需要在For Each控制器里做以下配置:
- 把For Each控制器的输入变量前缀设为
username,勾选“添加下划线”(默认就是勾选的) - 循环时,JMeter会自动生成一个索引变量,格式是
__jm__[你的For Each控制器名称]__idx,比如你的控制器叫“遍历账号”,那变量就是__jm__遍历账号__idx - 在HTTP请求里,直接用这个索引来引用对应的
f_authority:- 用户名用:
${username}(For Each自动赋值的当前循环值) - 权限用:
${f_authority_${__jm__遍历账号__idx}}
- 用户名用:
这样就能保证每次循环拿到的是同一行的username和f_authority了。
方法二:用BeanShell后置处理器预存组合变量
如果你想更灵活地处理,可以在JDBC请求后面加一个BeanShell后置处理器,把每一行的两个字段组合成一个变量,再用For Each遍历:
- 在BeanShell后置处理器里写这段代码:
// 获取查询结果的总条数 int total = Integer.parseInt(vars.get("username_#")); // 循环遍历每一行,组合username和f_authority for(int i=1; i<=total; i++){ String user = vars.get("username_" + i); String auth = vars.get("f_authority_" + i); // 用分隔符(比如|)把两个值拼起来,存成新的变量 vars.put("user_auth_pair_" + i, user + "|" + auth); } // 设置组合变量的总条数 vars.put("user_auth_pair_#", String.valueOf(total));
然后配置For Each控制器:
- 输入变量前缀设为
user_auth_pair - 勾选“添加下划线”
- 输入变量前缀设为
在For Each控制器内部,加一个BeanShell预处理程序,拆分组合变量:
String pair = vars.get("user_auth_pair"); // 按照分隔符拆分 String[] parts = pair.split("\\|"); // 存成单独的变量供HTTP请求使用 vars.put("current_username", parts[0]); vars.put("current_authority", parts[1]);
- 最后在HTTP请求里直接用
${current_username}和${current_authority}就可以了。
小提示
现在JMeter官方更推荐用JSR223元件代替BeanShell,性能更好,语法也更灵活,上面的代码只需要稍微调整就能在JSR223里运行(比如不需要显式的类型转换,代码更简洁)。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

