【问题标题】:jmeter won't keep cookies across thread groupsjmeter 不会跨线程组保留 cookie
【发布时间】:2015-07-01 05:53:06
【问题描述】:

(关于CookieManager似乎存在各种问题,但我在搜索时找不到我的问题)

我正试图弄清楚为什么 Cookie 管理器没有保留我的 cookie,但我的想法已经不多了。

使用 jmeter 2.13

我有以下测试计划设置:

- HTTP Headers
- HTTP Cookie Manager ("clear each iteration" is NOT checked, policy=compatibility, tried both implementation options)
- Thread group 1
    -- perform login (returns a Set-Cookie header as expected)
- Thread groups 2-n
    -- send http queries using cookies from login (this is the plan!)

每个请求返回 200,任何地方都没有重定向(除了第二个线程因为缺少 cookie 而重定向到登录页面)

我的问题: 在进入线程组 2 之前,日志显示 CookieManager 已清除所有 cookie。我不明白为什么 - 它不应该保留它们,因为标题 Manager 是顶级元素?

这里是显示这一点的日志部分(有问题的行标有######):

    2015/06/30 16:19:55 INFO  - jmeter.engine.StandardJMeterEngine: Starting ThreadGroup: 1 : TEST LOOP 0 - login 
    2015/06/30 16:19:55 INFO  - jmeter.engine.StandardJMeterEngine: Starting 1 threads for group TEST LOOP 0 - login. 
    2015/06/30 16:19:55 INFO  - jmeter.engine.StandardJMeterEngine: Thread will continue on error 
    2015/06/30 16:19:55 INFO  - jmeter.threads.ThreadGroup: Starting thread group number 1 threads 1 ramp-up 1 perThread 1000.0 delayedStart=false 
    2015/06/30 16:19:55 DEBUG - jmeter.protocol.http.control.CookieManager: Clear all cookies from store 
    2015/06/30 16:19:55 INFO  - jmeter.threads.ThreadGroup: Started thread group number 1 
    2015/06/30 16:19:55 INFO  - jmeter.engine.StandardJMeterEngine: Waiting for thread group: TEST LOOP 0 - login to finish before starting next group 
    2015/06/30 16:19:55 INFO  - jmeter.threads.JMeterThread: Thread started: TEST LOOP 0 - login 1-1 
    2015/06/30 16:19:55 DEBUG - jmeter.protocol.http.control.HC3CookieHandler: Found 0 cookies for [url edited] 
    2015/06/30 16:19:56 DEBUG - jmeter.protocol.http.control.HC3CookieHandler: Received Cookie: JSESSIONID_PUBLIC=swfw6xfdo0es18e5ux1xhad6a;Path=/url/edited;HttpOnly From: [url edited] 
    2015/06/30 16:19:56 DEBUG - jmeter.protocol.http.control.CookieManager: Add cookie to store server-edited   TRUE    /url/edited FALSE   0   JSESSIONID_PUBLIC   swfw6xfdo0es18e5ux1xhad6a 
    2015/06/30 16:19:56 INFO  - jmeter.threads.JMeterThread: Thread is done: TEST LOOP 0 - login 1-1 
    2015/06/30 16:19:56 INFO  - jmeter.threads.JMeterThread: Thread finished: TEST LOOP 0 - login 1-1 
    2015/06/30 16:19:56 DEBUG - jmeter.protocol.http.sampler.HTTPHC4Impl: Thread Finished 
    2015/06/30 16:19:56 INFO  - jmeter.engine.StandardJMeterEngine: Starting ThreadGroup: 2 : TEST LOOP 1 - search, high frequency, Ssd-Requests 
    2015/06/30 16:19:56 INFO  - jmeter.engine.StandardJMeterEngine: Starting 1 threads for group TEST LOOP 1 - search, high frequency, Ssd-Requests. 
    2015/06/30 16:19:56 INFO  - jmeter.engine.StandardJMeterEngine: Thread will continue on error 
    2015/06/30 16:19:56 INFO  - jmeter.threads.ThreadGroup: Starting thread group number 2 threads 1 ramp-up 20 perThread 20000.0 delayedStart=false 
    ##### 2015/06/30 16:19:56 DEBUG - jmeter.protocol.http.control.CookieManager: Clear all cookies from store ######
    2015/06/30 16:19:56 INFO  - jmeter.threads.ThreadGroup: Started thread group number 2 
    2015/06/30 16:19:56 INFO  - jmeter.engine.StandardJMeterEngine: All thread groups have been started 
    2015/06/30 16:19:56 INFO  - jmeter.threads.JMeterThread: Thread started: TEST LOOP 1 - search, high frequency, Ssd-Requests 2-1 

我尝试更改 jmeter.properties 中的一些设置:

 CookieManager.save.cookies=true

还有

CookieManager.check.cookies=false

但似乎都不起作用。

我的第一个理论是,它与相关 cookie 没有添加过期这一事实有关,但我在添加它时没有看到错误 - 只是它在不应该被删除时再次被删除。

【问题讨论】:

    标签: cookies jmeter


    【解决方案1】:

    您对线程组和 Cookiemanager 有误解。

    首先每个线程都有自己的 Cookie 版本,该版本在线程完成每个样本后更新

    其次,变量或与 cookiemanager 之类的线程关联的任何对象都由线程共享,因此根本不被 2 个线程组共享。

    即使 Dmitri 指出 Beanshell,在不同线程组中的线程之间共享内容对于脚本的性能或可维护性也不是一个好主意。

    我认为您正在使用 2 个不同的线程组,但应该只使用 1 个,这将解决您的问题。

    【讨论】:

    • 啊,好吧,这将是一个解释。我从文档中收集到,如果您将 CookieManager 放在顶层,它将跟踪所有线程组中的所有 cookie(登录完成后将并行运行)。这对于我的测试正常工作很重要。所以你是说我需要为此编写脚本?这似乎是一个相当简单的用例。或者有没有办法在线程组内并行运行请求?
    • 置于顶部,这意味着它仅适用于所有元素,但每个线程都会有一个 CookieManager,并且由于 2 个线程组中不存在 1 个线程,这就是它不适合您的原因。
    • 好的,我现在可以使用了。将所有内容移动到线程组内的循环控制器内。感谢您为我指明正确的方向!
    • @UBIKLOADPACK 那么有没有办法在线程组之间共享 cookie?
    【解决方案2】:

    选项 1:

    使用 JMeter 的__setProperty() 函数将变量转换为属性。 JMeter 变量范围仅限于当前线程组,而 JMeter 属性实际上是java.util.Properties,因此它们对于整个 JVM 都是全局的。

    选项 2:

    使用脚本提取 cookie 名称和值(以及域、过期、安全等字段)。这种方法更复杂,但它提供了更多的控制和灵活性。有关在不同线程组之间共享 cookie 的示例代码,请参见 How to use BeanShell: JMeter's favorite built-in component 指南。

    【讨论】:

    • 嗨,Dmitri,我一直很感谢您的回答,但我认为这个回答不正确。
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多