在JMeter中的线程组之间共享cookie值

时间:2012-03-22 15:57:28

标签: jmeter

我有以下设置:

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管理器和登录页面放入用户登录的同一个线程中,点击一堆页面然后登录并再次执行。

9 个答案:

答案 0 :(得分:22)

我的问题应该更加明确,但我们已经解决了这个问题。这是我们的解决方案:

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文件,然后转到&#34; CookieManager.save.cookies = false&#34;并使它=真。

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

答案 1 :(得分:6)

这里没有其他解决方案适合我,但他们都有一部分解决方案。这里最终将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

答案 2 :(得分:2)

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

因此...

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

那说我仍然会使用你描述的技巧,因为我认为我们想要登录一次,然后从不同的线程组中并行打几个不同的页面。因此我们将首先登录,然后几个不同的线程组将同时命中服务器。所以你的技巧绝对有用。但是对于简单的情况,我认为循环控制器可以做到这一点。

答案 3 :(得分:1)

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

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

这可以在没有任何其他额外采样器的情况下解决您的问题 或者也许有一些客观的理由来实现你的方式?

...请同时查看this

答案 4 :(得分:0)

上面的答案确实帮助了我,但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
....

答案 5 :(得分:0)

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

所以,这是另一个执行Login的解决方案,然后传递.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);

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这对我有用。

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
 

答案 8 :(得分:-2)

对于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);