【问题标题】:Share hash map between thread in jmeter with beanshell scripting使用 beanshell 脚本在 jmeter 中的线程之间共享哈希映射
【发布时间】:2019-09-20 03:20:29
【问题描述】:

J 米脚本包含两个线程。线程 01 是一个设置线程,它在执行作为测试的线程 2 之前循环“n”次。 我在两个线程中都实现了两个 beanshell 处理器,并包含以下代码。

线程 01:(设置线程)>> 使用 Beanshell 后处理器

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 执行的每个循环中被覆盖。因此哈希映射只包含最后一个循环执行数据。我需要分配在线程 01 执行中创建的所有值并在线程 2 中获取它们。 有什么建议吗?

【问题讨论】:

    标签: performance jmeter share beanshell


    【解决方案1】:

    首先要知道since JMeter 3.1 it is recommended to use JSR223 Test Elements and Groovy language for scripting。 Groovy 中没有 bsh.shared 命名空间,但是您可以使用 props shorthand 实现相同的目的,它可用于跨线程和线程组传递变量。

    1. 在第一个线程组中:

      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)
      
    2. 在第二个线程组中:

      def count_id=vars.get('count_id')
      def refreshCodeMap = props.get('refreshCodeMap')
      log.info(count_id)
      log.info(refreshCodeMap.get(count_id))
      

    演示:

    【讨论】:

    • 谢谢。我已经用 beanshell 脚本尝试了这个,并在测试计划中定义了哈希映射并共享。我的 jmeter 版本是 3.3。但是一旦我重新启动 jmeter 并执行测试,我就会间歇性地出错。 [1]
    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多