

最近在压测过程中一个项目涉及到创建订单、筛单场景,在创建订单和筛单之前是必须用户进行登录后才能进行,一般业务逻辑也都是这样。通常登录只初始化一次,我们压测平台使用java代码脚本,init方法无传参入口,excute方法部分用不同用户参数去请求,应用数据库查询发现仅只有一个用户在创建订单和筛单。
经排查,Cookie使用了同一个导致了此问题出现,虽然后续代码做了一些优化,但都需要登录,这样登录模块性能也在本次压测中,影响了对创建订单和筛单的压测。
遂使用Jmeter工具进行脚本编写,使不同用户能够获取到各自Cookie进行订单创建或筛单,本文讲述Jmeter获取Cookie的两种方式


不跟随重定向请求的Cookie获取
在登录请求不跟随重定向(Jmeter中取消勾选Follow Redirects)情况下通过关联去获取Cookie

在需要使用Cookie的地方引用需要的Cookie值即可,本例中引用方式为${vas_sessionId}其中vas_sessionId是关联的变量名称

筛单请求成功



跟随重定向请求的Cookie获取
在登录请求跟随重定向(Jmeter中勾选Follow Redirects)情况下通过关联去获取Cookie,获取不到,关联返回默认值ERRRROR,导致筛单失败(401认证失败)。



对于这种情况解决方法就是获取HTTP Cookie Manager配置元件所保存的Cookie.

第一步,打开jmeter.properties配置文件,设置CookieManager.save.cookies=true
第二步,通过F12,抓包工具,研发沟通等获取到需要的Cookie的名称,本例中Cookie的名称:vas_sessionId

第三步,在需要使用Cookie的地方引用需要的Cookie值,本例中引用方式为${COOKIE_vas_sessionId}其中COOKIE_是HTTP Cookie Manager储存Cookie时默认加上的固定前缀,保持默认就好了,确实要改请参考文档进行前缀修改。

按照如上步骤,筛单成功



性能测试场景设计
解决了Cookie值的获取,对于登录部分使用仅一次逻辑控制器(Once Only Controller)避免同一个用户(线程)重复登录操作,经过查看结果树以及应用数据库查询比对,确认不同用户创建、筛选了各自账户下的订单,功能实现无问题。
具体到压测操作,因为涉及到不同用户登录,仅一次登录后Cookie值传递给后续筛单请求会一直使用这个Cookie,在测试过程中只使用了5个用户登录,那么数据库中会看到5个(或更少)用户筛选的订单。如需达到更多用户筛选不同订单,建议采取容量测试方式,这样jmeter根据线程组设置的梯度增加的用户就会进行一次初始化登录后去创建订单、筛单,整体样本用户就更多了。
唯一要求就是用户参数化数量不能比设置的线程数少,这样可以避免两个相同用户同时去筛选自己的订单了,除了保持和线上业务操作一致外也可能避免了数据库更新操作方面的问题,做到不因脚本问题导致原本不是性能问题的问题。


总结
HTTP请求在Jmeter中有跟随重定向和不跟随重定向操作的选项配置,基于这两种情况,有上述两种获取Cookie值的方式。
脚本中使用HTTP Cookie Manager前提下,跟随重定向请求产生的Cookie可通过${COOKIE_yourcookiename}获取;不跟随重定向请求产生的Cookie通过关联(Regular Expression Extractor)从响应头中获取。
结合实际业务场景进行了相关性能测试场景设计。




