注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

Grinder传cookie问题  

来自cen   2012-06-26 16:43:04|  分类: 性能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

(一)

Grinder是一个开源的Java负载测试框架,通过Jython来编写测试脚本。

 

在性能测试中,经常要模拟http请求对应用服务器进行性能测试。

Grinderjython脚本构造http请求时,某些请求涉及具体登录用户的操作,发送的http请求需要附带cookie值。

 

TCP代理录制的脚本中不含cookie值,所以需要手动添加cookie值到http请求脚本中,用FireBug抓取具体请求的cookie值,把其添加到jython脚本中。这里不涉及参数化,参数化后脚本直接读取文件中批量cookie值中的一个,添加到请求中。主要代码如下:

 

Headers0= \

  ( NVPair('Accept', '*/*'),

    NVPair('Accept-Encoding', 'gzip, deflate'),

    NVPair('Connection', 'keep-alive'),

    NVPair('Content-Type', 'text/plain; charset=UTF-8'),

NVPair('Host', 'www.lofter.com'),

    NVPair('Referer', 'http://www.lofter.com/'),

NVPair('User-Agent', 'Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0'),)

 

url0 = 'http://www.lofter.com:80'

 

request101 = HTTPRequest(url=url0, headers=headers0)

request101 = Test(801, 'POST TrackBean.getRadarItems.dwr').wrap(request101)

 

result = request101.POST('/dwr/call/plaincall/TrackBean.getRadarItems.dwr',      '''callCount=1\nscriptSessionId=${scriptSessionId}187\nc0-scriptName=TrackBean\nc0-methodName=getRadarItems\nc0-id=0\nbatchId=427403''',

      ( NVPair('Content-Type', 'text/plain'),

        NVPair('Cookie',cookie), ))

 

这样组织的请求脚本,发现服务器端并未成功接收到cookie,怀疑是grinder本身并未成功发送cookie信息,或者是设置cookie的方式错误。

 

grinder源码入手,进行了问题的定位。

 

断点调试grinder源码,需要将grinder.properties文件中的grinder.debug.singleprocess 值设为true

 

从源码中HTTPRequest类的POST方法开始跟,代码跑到HTTPClient/CookieModule.java文件中,源码274行,发现这里会把请求头中键名叫Cookie的键值对通过arraycopy删掉。

Grinder传cookie问题 - 网易杭州QA - 网易杭州 QA Team

将这段代码注释掉,发现可以正确传cookie,服务器端能正确响应。

(二)

进一步定位分析问题,CookieModule类中,源码作者有这么一段注释:

 * <P>This module expects to be the only one handling cookies. Specifically, it

 * will remove any <var>Cookie</var> and <var>Cookie2</var> header fields found

 * in the request, and it will remove the <var>Set-Cookie</var> and

 * <var>Set-Cookie2</var> header fields in the response (after processing them).

 * In order to add cookies to a request or to prevent cookies from being sent,

 * you can use the {@link #addCookie(HTTPClient.Cookie) addCookie} and {@link

 * #removeCookie(HTTPClient.Cookie) removeCookie} methods to manipulate the

 * module's list of cookies.

 

作者源码的意图是希望只用CookieModule模块处理cookie(降低耦合性?)。

 

所以源码会先把通过其他方法添加到请求头中的cookie删掉。

 

然后读取CookieModule类中的private static Hashtable cookie_cntxt_list = new Hashtable();(这个哈希表存储所有需要设置的cookie)添加到HTTP请求中

Grinder传cookie问题 - 网易杭州QA - 网易杭州 QA Team

如果我们想增删cookie到请求中,作者推荐我们使用CookieModule类中的addCookie(),removeCookie()等方法,这些方法将cookie增删到cookie_cntxt_list哈希表中,请求再读取cookie_cntxt_list中的cookie组织请求,由于不是通过CookieModule设置的cookie,cookie_cntxt_list 为空,其他方法添加的cookie又被删了,所以会出现没cookie传的问题。

 

CookieModule类处理cookie方法可以参阅例程

http://grinder.sourceforge.net/g3/script-gallery.html   HTTP cookies

 

(三)

上面这个例程中发现一段注释,如果想直接控制cookie  headers,可以把自动cookie处理机制设置成无效。

Grinder传cookie问题 - 网易杭州QA - 网易杭州 QA Team

采用第一部分的方式,再添加HTTPPluginControl.getConnectionDefaults().useCookies = 0这句话,可以正确传cookie,服务器端能正确响应。

(四)

综上所述,

(1)    通过http header的方式传cookie脚本中加HTTPPluginControl.getConnectionDefaults().useCookies = 0这句话,把自动cookie处理机制设置成无效。该方法实现较容易,推荐使用。

2)在jython脚本中用CookieModule这个类中的addCookie等方法处理cookie,最终grinder只认cookie_cntxt_list中的cookie。该方需   要设置cookie的每一个键值对,略显复杂。

参阅例程:http://grinder.sourceforge.net/g3/script-gallery.html   HTTP cookies

3)通过http header的方式传cookie,将grinder源码中的cookie处理注释掉,这个方法可行,但不推荐。

  评论这张
 
阅读(1048)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016