(关于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。我不明白为什么 - 它不应该保留它们,因为标题管理器是一个顶级元素?
这是显示此内容的日志部分(相关行标有######):
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没有添加过期的事实有关,但我在添加它时没有看到错误 - 只是当它不应该被删除时再次被删除。
答案 0 :(得分:2)
您误解了线程组和Cookiemanager。
首先,每个线程都有自己的Cookie版本,在线程完成每个样本后都会更新
其次,变量或与cookiemanager等线程相关联的任何对象都由线程共享,所以2个线程组根本不共享。
即使Dmitri指向Beanshell,脚本的性能或可维护性在不同线程组中的线程之间共享也不是一个好主意。
我认为您使用的是2个不同的线程组,但应该只使用1个,这样可以解决您的问题。
答案 1 :(得分:0)
选项1:
使用JMeter的__setProperty()函数将变量转换为属性。 JMeter变量范围仅限于当前线程组,而JMeter属性实际上是java.util.Properties,因此它们对于整个JVM是全局的。
选项2:
使用脚本来提取Cookie名称和值(以及域,过期,安全等字段)。这种方法更复杂,但它提供了更多的控制和灵活性。有关在不同线程组之间共享cookie的示例代码,请参阅How to use BeanShell: JMeter's favorite built-in component指南。