Jmeter 在线程组之间共享 Cookie

2018-09-11
标签: JMETER
本文发布至今已有5年零222天,可能不再适用,请谨慎对待。

在 《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}

如果您对本站内容有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

标签: JMETER

欢迎转载本文,惟请保留 原文出处 ,且不得用于商业用途。
本站 是个人网站,若无特别说明,所刊文章均为原创,并采用 署名协议 CC-BY-NC 授权。