Jmeter 在线程组之间共享 Cookie

发表时间

Jmeter 如何管理 Cookie 一文中提到,Cookie Manager 的作用范围是当前的线程组。如果有多个线程组,需要将 Cookie 在线程组之间传递,就需要使用全局属性传递。具体做法见本文内容。

目录

本文使用的 Jmeter 是 4.0 版本

本文目的

假如我们使用结构如下的测试计划:

Test Plan
  ├─ Setup Thread Group
  │    ├─ HTTP Cookie Manager
  │    └─ Log on    # 拿到 Cookie
  │ 
  ├─ Thread Group
  │    └─ Request   # 使用 Cookie
  │ 
  └─ TearDown Thread Group
       └─Log out    # 使用 Cookie

从图中可以看出,包括三个独立的线程组。其中
Setup Thread Group 中包含登录步骤 Log on ,获得登录 Cookie
Thread Group 是正式发请求的部分,希望在请求中带上前面获得的 Cookie
TearDown Thread Group 负责善后事务,同样希望带上 Cookie

思路

为了达到上述目的,基本的步骤分解如下:

Setup Thread Group保存 Cookie 到属性变量(Properties)
Thread Group 从属性变量(Properties)中读出 Cookie
TearDown Thread Group 从属性变量(Properties)中读出 Cookie

保存 Cookie

Jmeter 如何管理 Cookie 一文讨论过保存 Cookie 到属性变量的的方法,这里再介绍一下,具体是:

允许保存 Cookie

首先编辑 Jmeter 的属性文件: bin/jmeter.properties , 修改其中的

# CookieManager behaviour - should Cookies be stored as variables?
# Default is false
#CookieManager.save.cookies=false

最后一行去掉#号,并改为

CookieManager.save.cookies=true
Cookie 在属性中保存的形式

上面的步骤完成后,CookieManager 每次收到一个新的 Cookie ,会保存在属性值,比如名称为 site 的 Cookie 会保存到 COOKIE_site 变量里。可以用 Debug Sampler 查看保存的变量。我们在脚本里加上 Debug Sampler :

Test Plan
  ├─Setup Thread Group
  │    ├─ HTTP Cookie Manager
  │    ├─ Log on
  │    ├─ Debug Sampler         # 用于记录属性值列表
  │    └─ View Results Tree     # 用于查看属性值列表
  │         

默认情况下, Debug Sampler 是不显示属性值的,需要将开关打开:

以百度为例

举个例子,我们请求百度的首页:会得到一些 Cookie:

获得的响应中有 set-Cookie 的内容:

到 Debug Sampler 中就可以看到 保存在变量列表中:

保存 Cookie

下面需要将 Cookie 变量转移到属性中。为 Log on 一步添加 JSR223 PostProcessor

Test Plan
  ├─Setup Thread Group
  │    ├─ HTTP Cookie Manager
  │    └─ Log on
  │         └─ JSR223 PostProcessor     # 新增
  │
  ├─ Thread Group
  │    └─ Request
  │
  └─TearDown Thread Group
       └─ Log out

在 JSR223 PostProcessor 的代码文本框中,填入如下 Groovy 代码:

props.put("cookie_site", vars.get("COOKIE_site"))

这条语句的意思是,从当前线程组的变量中,提出 COOKIE_site 变量的值,存入名叫 cookie_site 的属性中。 关于 props.putvars.get 方法,具体用法参考 《Jmeter 的 vars 和 props 用法》

加载 Cookie

全局属性

接下来,则按照 Jmeter 的变量类型和作用域 一文的分析,在线程组之间传递变量,最佳的方法是利用 Jmeter Properties(属性)。

从上图看出,属性的作用范围是全局的,从每个线程组内部可以读取或者写入属性值。既然上面的 保存一节 已经将Cookie写入属性,接下来可以在另一个线程组中读出Cookie

添加 Cookie Manager

加载 Cookie 的方法,只要在线程组内添加 Cookie Manager

Test Plan
  ├─Setup Thread Group
  │    ├─ HTTP Cookie Manager
  │    └─ Log on
  │         └─ JSR223 PostProcessor  
  │
  ├─ Thread Group
  │    ├─ HTTP Cookie Manager    # 新增
  │    └─ Request
  │
  └─TearDown Thread Group
       └─ Log out
插入 Cookie
每条 Cookie 包括三部分:
  • Cookie 名称
  • Cookie 值
  • 作用域 Domain

都体现在 Cookie Manager 的 User-Defined Cookies 一栏内:

在上图中,手动新增一条名为 site 的Cookie,然后使用 ${__property()} 函数 读取 cookie_site 属性值,同时指定了作用域 ${your_domain}


相关文章
除非特别说明,本站文章均系原创,并采用 署名协议 CC-BY 授权。
欢迎转载,惟请保留原文链接:https://lfhacks.com/tech/jmeter-share-cookie