【问题标题】:Sharing cookie values between thread groups in JMeter在 JMeter 中的线程组之间共享 cookie 值
【发布时间】:2021-04-13 22:29:17
【问题描述】:

我有以下设置:

Thread A
  - Http Cookie Manager
  - Login Page
Thread B
  - Http Cookie Manager
  - Page to hit
  - Another page to hit

我一直试图将登录页面中设置的 cookie 设置为全局属性,然后将其设置为线程 B 中的 Http Cookie 管理器。但是我一直无法正确处理。我尝试过 BeanShell PostProcessors 等,但无法正确设置。

=== 添加说明 ===

我无法在线程 B 中拥有登录页面和 cookie 管理器的原因是由于所需的行为。目标是登录,获取 cookie,然后一遍又一遍地点击一堆页面。这使我们能够登录一次,然后模拟该用户的大量点击。通过将 cookie 管理器和登录页面放在用户登录的同一个线程中,点击一堆页面,然后登录并再次执行。

【问题讨论】:

    标签: jmeter


    【解决方案1】:

    我的问题应该更清楚一点,但我们已经解决了这个问题。这是我们的解决方案:

    Http Cookie Manager
    Thread A - 1 Thread - 1 Loop Count
      - Login Page
          - BeanShell PostProcessor
                - props.put("MyCookie","${COOKIE_<INSERT ACTUAL COOKIE NAME>}");
    Thread B - 50 Threads - Infinite Loop Count
      - BeanShell PreProcessor 
          - import org.apache.jmeter.protocol.http.control.CookieManager;
            import org.apache.jmeter.protocol.http.control.Cookie;
            CookieManager manager = sampler.getCookieManager();
            Cookie cookie = new Cookie("<INSERT ACTUAL COOKIE NAME>",props.get("MyCookie"),"<INSERT DOMAIN NAME>","<INSERT COOKIE PATH>",false,0);
            manager.add(cookie);
      - Page to hit
      - Another page to hit, repeat as needed
    

    那么需要对 JMeter 进行配置更改:

    打开 jmeter.properties 文件并转到“CookieManager.save.cookies=false”行并使其 = true。

    这将允许在第二个线程中使用第一个线程中的登录 cookie。

    【讨论】:

    • @Clarence Klopfstein,我使用了你所做的方法,我可以看到相同的 cookie 名称和值,但我使用的请求现在显示“[no cookies]”。有什么想法吗?
    • @Clarence Klopfstein,您好,谢谢您的回答,如果我的 cookie 中只有一个字段,此方法有效,如何在 cookie 中添加多个字段。
    • @VishalPuliani 查看更多详细信息here,在线程组之间传递 Cookie 下
    • 解决方案仍然有效,但请确保在设置 CookieManager.save.cookies 时删除行首的 # 注释。我认为有些人可能没有这样做,并认为解决方案不起作用。
    【解决方案2】:

    这里没有其他解决方案对我有用,但它们都有解决方案的一部分。这是最终将cookie(在我的情况下为JSESSIONID)从一个线程组传递到另一个线程组的方法。请注意,我不需要将 CookieManager.save.cookies 设置为任何内容。

    Http Cookie Manager
    Thread A - 1 Thread - 1 Loop Count
      - Login Page
          - BeanShell PostProcessor
                - import org.apache.jmeter.protocol.http.control.CookieManager;
                  import org.apache.jmeter.protocol.http.control.Cookie;
                  import org.apache.jmeter.testelement.property.PropertyIterator;
                  import org.apache.jmeter.testelement.property.JMeterProperty;
                  CookieManager manager = ctx.getCurrentSampler().getCookieManager();
                  PropertyIterator iter = manager.getCookies().iterator();
                  while (iter.hasNext()) {
                      JMeterProperty prop = iter.next();
                      Cookie cookie = prop.getObjectValue();
                      if (cookie.getName().equals("JSESSIONID")) {
                          props.put("MySessionCookie", cookie);
                          break;
                      }
                  }
    Thread B - 50 Threads - Infinite Loop Count
      - BeanShell PreProcessor 
          - import org.apache.jmeter.protocol.http.control.CookieManager;
            import org.apache.jmeter.protocol.http.control.Cookie;
            CookieManager manager = sampler.getCookieManager();
            manager.add(props.get("MySessionCookie"));
      - Page to hit
      - Another page to hit, repeat as needed
    

    【讨论】:

    • 这就像一个魅力。只有一件事,我们还需要在线程组中添加HTTP Cookie管理器。
    • 此解决方案仍然有效,线程组中不需要额外的 HTTP Cookie 管理器
    【解决方案3】:

    您可以使用带有Once Only Controller 的单个线程组,而不是使用单独的线程组来登录用户。在 Once Only Controller 下添加 Samplers 以登录并获取会话 cookie(当然只会运行一次)。从那时起,线程组将只运行其他采样器,将会话 cookie 传递给每个请求。我在 测试计划 范围内有 HTTP Cookie 管理器

    【讨论】:

    • 这是一个很好的答案。
    【解决方案4】:

    CookieManager 不在线程之间共享 cookie。出于某种原因,@ClarenceKlopfstein 的方法对我不起作用(jmeter 3.0)。出于某种原因,"${COOKIE_&lt;INSERT ACTUAL COOKIE NAME&gt;}" 似乎没有评估传递的字符串。

    所以,这里有另一种解决方案来进行登录,然后传递.ASPXAUTH cookie。它应该可以在没有任何配置更改的情况下工作: 在 setUp Thread Group(重要)中:

    BeanShell PostProcessor:
     import org.apache.jmeter.protocol.http.control.CookieManager;
     import org.apache.jmeter.protocol.http.control.Cookie;
    
     CookieManager manager = ctx.getCurrentSampler().getCookieManager();
     Cookie cookie = manager.get(3); //Find the '.ASPXAUTH' cookie
     log.info("Cookie:" + cookie);
     props.put("MyCookie",cookie.getValue());
    

    然后在一个普通的线程组中:

    BeanShell PreProcessor:
     import org.apache.jmeter.protocol.http.control.CookieManager;
     import org.apache.jmeter.protocol.http.control.Cookie;
     CookieManager manager = sampler.getCookieManager();
     Cookie cookie = new Cookie(".ASPXAUTH",props.get("MyCookie"),"<DOMAIN>","/",false,0);
     manager.add(cookie);
    

    【讨论】:

    • 您仍然需要测试计划级别的 CookieManager @ShaiAlon。你试过没有吗?
    【解决方案5】:

    我的用例和你一样,但我认为有一个更简单的解决方案:在线程组内你可以使用循环控制器。

    所以...

    Thread Group
       Login
       Loop Controller
         - Page to hit
         - Another page to hit
    

    也就是说,我仍将使用您描述的技巧,因为我认为我们将希望登录一次,然后从不同的线程组并行访问几个不同的页面。所以我们会先登录,然后几个不同的线程组会同时访问服务器。所以你的把戏绝对有用。但对于简单的情况,我认为循环控制器可以做到。

    【讨论】:

    • Loop 控制器中的 Hits 是顺序的还是并行的?
    • sequential - 这正是 NOT 使用这种方式的原因。
    【解决方案6】:

    为什么不将 Http Cookie Manager 添加到测试计划级别而不是线程组一并将所有采样器分组到一个线程组中?

    Test Plan
        Http Cookie Manager
        Thread Group
            - Login Page
            - Page to hit
            - Another page to hit
    

    这应该可以解决您的问题,而无需任何其他额外的采样器。
    或者也许有一些客观原因来实施你的做法?

    ...也请关注this

    【讨论】:

    • 我稍后会发布我们的解决方案,但我们已经成功了。不过,为了回答您的建议,我们的想法是登录一次并做很多事情,看看它的表现如何。您的方法每次迭代都需要登录。不是现实的负载测试。
    • 将 HTTP Cookies 管理器放在测试计划级别对我不起作用... :(
    【解决方案7】:

    上面的答案确实帮助了我,但 HTTP cookie 管理器是 错过了让它工作所需的细节。 通过如下设置 cookie 管理器,它对我有用

    Http Cookie Manager
    NAME   $<ACTUAL_COOKIE_NAME>
    VALUE  ${COOKIE_<INSERT_ACTUAL_COOKIE_NAME>}    
    DOMAIN ${SITE}   
    PATH    /
    Thread A - 1 Thread - 1 Loop Count
    ....
    Thread B - 50 Threads - Infinite Loop Count
    ....
    

    【讨论】:

      【解决方案8】:

      这对我有用。

      Http Cookie Manager
      Thread A - 1 Thread - 1 Loop Count
        - Login Page 
            here you get the cookie from the browser and save it to a variable MY_COOKIE)
            - JSR223 PostProcessor
               props.put("MY_COOKIE",vars.get("MY_COOKIE"))
              
      Thread B - 50 Threads - Infinite Loop Count
        - JSR223 PreProcessor 
            vars.put("MY_COOKIE",props.get("MY_COOKIE"))
        - Page to hit
       
      

      【讨论】:

        【解决方案9】:

        对于 cookie 中的多个字段,我尝试了此方法

           BeanShell Post Processor 
           props.put("MyCookie","${COOKIE_<FIRST    FIELD>}");
           props.put("MyCookie1","${COOKIE_<SECOND FIELD>}");
        
          BeanShell Pre Processor
        
          import org.apache.jmeter.protocol.http.control.CookieManager;
          import org.apache.jmeter.protocol.http.control.Cookie;
          CookieManager manager = sampler.getCookieManager();
          Cookie cookie = new Cookie("<FIRST FIELD>",props.get("MyCookie"),"DOMAIN","/",false,0);
          manager.add(cookie);
          Cookie cookie1 = new Cookie("<SECOND FIELD>",props.get("MyCookie1"),"DOMAIN NAME","/",false,0);
          manager.add(cookie1);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          • 2019-02-09
          • 2021-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多