Apache JMeter中的会话/ cookie管理

时间:2009-09-07 13:35:57

标签: java session cookies jmeter session-cookies

我们在应用程序中有一个简单的性能测试流程。

  1. 我们登录
  2. 根据一些标准进行搜索
  3. 重复搜索不同的参数。
  4. 我们正在使用Jmeter进行性能测试。我们需要运行多个线程来以可扩展的方式对其进行测试。

    我们目前的安排方式是:

    -Test Plan
      - Thread Group
          - Cookie Manager
          - Login To application
          - Search on param 1
          - Search on param 2
      - results summary table
      - Summary report
    

    所以基本上我们在计划级别上有汇总返回表和报告,而cookie管理器出现在线程组级别。

    当我为一个线程运行时,它运行良好并且完成得很好。当我将它扩展到多个线程时,一旦下一个线程启动,最后一个线程的会话就会失效。由于新生成的线程,这会导致所有已经运行的线程失败。

    我通过观察达到了这个结果:
    1。如果我运行多个线程,则只有最后一个线程在结果摘要树中获得了有效响应
    2。如果我运行2个线程,加速周期为10秒,这意味着每个线程都有时间完成自己,然后它们都成功运行。

    根据我的理解,每个线程登录到应用程序,并且由于cookie管理器处于线程级别,因此将分别为每个线程的会话ID维护这些值?但是什么导致线程之间的会话id值被覆盖?

    任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:46)

从jmeter文档复制:

  

最后一个元素是HTTP Cookie   经理 。 Cookie经理应该是   添加到所有Web测试 - 否则   JMeter将忽略cookie。 添加   它在Thread Group级别,我们   确保所有HTTP请求都会   分享相同的cookie。

http://jmeter.apache.org/usermanual/test_plan.html中的“4.2.2逻辑控制器”一章。

编辑:我猜您应该使用http://jmeter.apache.org/usermanual/component_reference.html#Simple_Controller将您的请求与Cookie管理器一起分组。

答案 1 :(得分:6)

我认为安德烈的答案无济于事。他引用了每个请求将使用相同的cookie但是根据jmeter手册:

  

每个JMeter线程都有自己的“cookie存储区域”。

据我了解这个问题,您希望每个线程共享相同的会话ID cookie。所以在我看来你需要有两个线程组并连续执行它们。第一个线程组(只有一个执行一次的线程)应该登录并将会话cookie值保存到全局参数(可能需要使用jmeter的脚本功能)。 然后在第二个线程组的cookie管理器中设置该cookie。

希望有所帮助。

答案 2 :(得分:1)

尝试增加加速时间。我遇到了同样的问题,其中加速时间约为1秒,然后我将每个线程增加到3秒并且运行正常。

答案 3 :(得分:0)

试试这个:

打开JMeter的bin文件夹中的user.properties

编辑它并添加以下行:

CookieManager.check.cookies=false

保存并运行脚本。我希望它能解决你的问题。

答案 4 :(得分:0)

首先将代码更改为:

jmeter.properties
CookieManager.save.cookies=true
CookieManager.name.prefix=mycookie_

接下来,在与java sampler相同的线程组中添加HTTP cookie管理器。

然后在你的java sampler中添加:

JMeterVariables jmv = JMeterContextService.getContext().getVariables();
Iterator<Map.Entry<String,Object>> it = jmv.getIterator();
while(it.hasNext()){
    Map.Entry<String,Object> v = it.next();
    System.out.println("name: " + v.getKey() + " value: " + v.getValue());
}