使用 beanshell 脚本在 jmeter 中的线程之间共享哈希映射
Share hash map between thread in jmeter with beanshell scripting
J计脚本包含两个线程。线程 01 是一个设置线程,它在执行作为测试的线程 2 之前循环 'n' 次。
我在两个线程中都实现了两个 beanshell 处理器并包含以下代码。
线程 01:(设置线程)>> 使用 Beanshell post 处理器
String mapKey=vars.get("count_id");
String refresh_Token = vars.get("refreshToken");
Map refreshCodeMap = new HashMap();
refreshCodeMap.put(mapKey,refresh_Token);
log.info(mapKey + "Map key");
log.info(refresh_Token + "refresh Token");
bsh.shared.refreshCodeMap= refreshCodeMap;
线程 02:(测试)>> 使用了 beanshell 预处理器
String count_id=vars.get("count_id");
Map refreshCodeMap = bsh.shared.refreshCodeMap;
log.info(count_id);
log.info(refreshCodeMap.get(count_id));
但是在线程o1中,输出如下。
2019-09-20 08:41:57,194 INFO o.a.j.u.BeanShellTestElement: 1
2019-09-20 08:41:57,194 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,210 INFO o.a.j.u.BeanShellTestElement: 2
2019-09-20 08:41:57,211 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,224 INFO o.a.j.u.BeanShellTestElement: 3
2019-09-20 08:41:57,224 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,234 INFO o.a.j.u.BeanShellTestElement: 4
2019-09-20 08:41:57,234 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,243 INFO o.a.j.u.BeanShellTestElement: 5
2019-09-20 08:41:57,243 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,252 INFO o.a.j.u.BeanShellTestElement: 6
2019-09-20 08:41:57,253 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,260 INFO o.a.j.u.BeanShellTestElement: 7
2019-09-20 08:41:57,260 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,265 INFO o.a.j.u.BeanShellTestElement: 8
2019-09-20 08:41:57,265 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,270 INFO o.a.j.u.BeanShellTestElement: 9
2019-09-20 08:41:57,270 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,275 INFO o.a.j.u.BeanShellTestElement: 10
2019-09-20 08:41:57,275 INFO o.a.j.u.BeanShellTestElement: 2f889ccd-acfe-3345-bc68-21a52e71c8e2
这里定义的 hashmap 在线程 1 执行的每个循环中被覆盖。因此hash map只包含最后一次循环执行的数据。我需要分配在线程 01 执行中创建的所有值,并在线程 2 中获取它们。
有什么建议吗?
首先要注意since JMeter 3.1 it is recommended to use JSR223 Test Elements and Groovy language for scripting. There is no bsh.shared
namespace in Groovy however you can achieve the same using props
shorthand 可用于跨线程和线程组传递变量。
在第一个线程组中:
def refreshCodeMap = new HashMap()
if (props.get('refreshCodeMap') != null) {
refreshCodeMap = props.get('refreshCodeMap')
}
refreshCodeMap.put(vars.get('count_id'),vars.get('refreshToken'))
props.put('refreshCodeMap', refreshCodeMap)
在第二个线程组中:
def count_id=vars.get('count_id')
def refreshCodeMap = props.get('refreshCodeMap')
log.info(count_id)
log.info(refreshCodeMap.get(count_id))
演示:
J计脚本包含两个线程。线程 01 是一个设置线程,它在执行作为测试的线程 2 之前循环 'n' 次。 我在两个线程中都实现了两个 beanshell 处理器并包含以下代码。
线程 01:(设置线程)>> 使用 Beanshell post 处理器
String mapKey=vars.get("count_id");
String refresh_Token = vars.get("refreshToken");
Map refreshCodeMap = new HashMap();
refreshCodeMap.put(mapKey,refresh_Token);
log.info(mapKey + "Map key");
log.info(refresh_Token + "refresh Token");
bsh.shared.refreshCodeMap= refreshCodeMap;
线程 02:(测试)>> 使用了 beanshell 预处理器
String count_id=vars.get("count_id");
Map refreshCodeMap = bsh.shared.refreshCodeMap;
log.info(count_id);
log.info(refreshCodeMap.get(count_id));
但是在线程o1中,输出如下。
2019-09-20 08:41:57,194 INFO o.a.j.u.BeanShellTestElement: 1
2019-09-20 08:41:57,194 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,210 INFO o.a.j.u.BeanShellTestElement: 2
2019-09-20 08:41:57,211 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,224 INFO o.a.j.u.BeanShellTestElement: 3
2019-09-20 08:41:57,224 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,234 INFO o.a.j.u.BeanShellTestElement: 4
2019-09-20 08:41:57,234 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,243 INFO o.a.j.u.BeanShellTestElement: 5
2019-09-20 08:41:57,243 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,252 INFO o.a.j.u.BeanShellTestElement: 6
2019-09-20 08:41:57,253 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,260 INFO o.a.j.u.BeanShellTestElement: 7
2019-09-20 08:41:57,260 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,265 INFO o.a.j.u.BeanShellTestElement: 8
2019-09-20 08:41:57,265 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,270 INFO o.a.j.u.BeanShellTestElement: 9
2019-09-20 08:41:57,270 INFO o.a.j.u.BeanShellTestElement: null
2019-09-20 08:41:57,275 INFO o.a.j.u.BeanShellTestElement: 10
2019-09-20 08:41:57,275 INFO o.a.j.u.BeanShellTestElement: 2f889ccd-acfe-3345-bc68-21a52e71c8e2
这里定义的 hashmap 在线程 1 执行的每个循环中被覆盖。因此hash map只包含最后一次循环执行的数据。我需要分配在线程 01 执行中创建的所有值,并在线程 2 中获取它们。 有什么建议吗?
首先要注意since JMeter 3.1 it is recommended to use JSR223 Test Elements and Groovy language for scripting. There is no bsh.shared
namespace in Groovy however you can achieve the same using props
shorthand 可用于跨线程和线程组传递变量。
在第一个线程组中:
def refreshCodeMap = new HashMap() if (props.get('refreshCodeMap') != null) { refreshCodeMap = props.get('refreshCodeMap') } refreshCodeMap.put(vars.get('count_id'),vars.get('refreshToken')) props.put('refreshCodeMap', refreshCodeMap)
在第二个线程组中:
def count_id=vars.get('count_id') def refreshCodeMap = props.get('refreshCodeMap') log.info(count_id) log.info(refreshCodeMap.get(count_id))
演示: