Apache JMeter中的会话/cookie管理

53

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

  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管理器则在线程组级别上存在。

当我运行单个线程时,它可以正常运行并成功完成。但是,当我扩展到多个线程时,新启动的线程立即使上一个线程的会话失效。这会导致所有已经运行的线程因为新生成的线程而失败。

通过观察,我得出以下结果:
1. 如果我运行多个线程,只有最后一个线程在结果汇总树中得到有效响应。
2. 如果我以10秒的逐渐增加时间运行2个线程(这意味着每个线程都有时间来结束自己),那么它们都能成功运行。

根据我的理解,每个线程都会登录到应用程序中,由于Cookie管理器在线程级别上,因此值将分别维护每个线程的会话ID?但是是什么导致了会话ID值之间的覆盖?

任何帮助将不胜感激。

5个回答

49

7
我认为Andrey的答案无法帮助你。他引用了每个请求都将使用相同的cookie,但根据jmeter手册:
每个JMeter线程都有自己的“cookie存储区”。
就我理解这个问题,你想让每个线程共享相同的会话ID cookie。所以我觉得你需要有两个线程组并依次执行它们。第一个线程组(只有一个线程执行一次)应该登录并将会话cookie值保存到全局参数中(也许你需要使用jmeter的脚本功能)。然后在第二个线程组的cookie管理器中设置该cookie。
希望能对你有所帮助。

2
能否在同一测试计划的不同线程组之间“传播”cookie? 不行。JMeter线程旨在表示独立用户,因此cookie和变量是线程本地的。根据此链接 - Aliaksandr Belik

1
尝试增加启动时间。我遇到了相同的问题,启动时间大约为1秒,然后我将每个线程的启动时间增加到3秒,它就可以正常运行了。

0

请尝试以下操作:

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

编辑并添加以下行:

CookieManager.check.cookies=false

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


0
请将您的代码更改为:

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

接下来,在与您的Java采样器相同的线程组中添加一个HTTP cookie管理器。
然后在您的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());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接