2009-09-07 85 views
46

我们在应用程序中有一个简单的性能测试流程。Apache JMeter中的会话/ cookie管理

  1. 我们登录基于某些条件
  2. 不同的参数重复搜索
  3. 搜索。

我们使用Jmeter进行性能测试。我们需要运行多个线程以可扩展的方式来测试它。

我们现在有这样的排列方式是:

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

所以基本上我们有摘要返回表,并同时cookie管理器出现在线程组级别的报告出现在计划水平。

当我运行一个线程它运行良好,并完成。当我将其缩放到多个线程时,只要下一个线程启动,最后一个线程的会话就会失效。由于新产生的线程,这导致所有已经运行的线程失败。

我达到了这个结果与观察:结果概要树
2.
1.如果我运行多个线程,只有最后一个线程已经得到了有效的反应。如果我有2个线程与斜坡上升周期为10秒运行,这意味着每个线程都有时间完成自己,然后它们都成功运行。

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

任何帮助将不胜感激。

回答

46

从JMeter的文档复制:

的最后一个元素是一个HTTP Cookie的 管理器。一个Cookie管理器应该被添加到所有网络测试 - 否则 JMeter会忽略cookie。 通过在线程组级别添加 ,我们 确保所有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

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

6

我认为安德烈的回答是无能为力的。他引用每个请求都将使用相同的cookies,但根据jmeter手册:

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

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

希望有所帮助。

+2

+1了这一点。 *是否可以通过同一测试计划的不同线程组“传播”Cookie? 编号JMeter线程旨在表示独立用户,因此Cookie和变量对于线程是本地的。* 根据[this](http://jmeter.512774.n5.nabble.com/HTTP-cookie-manager -td544523.html)。 – 2012-01-17 17:26:44

0

试试这个:

打开user.properties目前在JMeter的

的bin文件夹

编辑,并添加以下行:

CookieManager.check.cookies=false 

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

0

首先改变你的代码:

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

接下来,相同的线程组中添加一个HTTP cookie管理器为您的Java采样。

然后在你的java采样补充:

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()); 
}