反骨仔

一个业余的 .NET Core 攻城狮

0%

21 自动登录禅道和自动开 Bug

“禅道”是一个国产的开源项目管理软件,支持需求管理、任务管理、缺陷管理和测试用例管理。本章将综合之前所学的知识,包括 HTTP 协议、Fiddler 抓包和JMeter 发包,来完成禅道系统的自动化测试 。

本章涉及自动化登录禅道、自动开 Bug、自动关 Bug,同时讲述 JMeter 中 HTTP Cookie 管理器和 HTTP 请求默认值的用法。

21.1 HTTP Cookie 管理器

前面的章节中解释过,HTTP 协议本身是无状态的,为了维持登录的状态,我们引入了 Cookie 机制 。

Cookie 的流程如下。

第一步,浏览器发送第一个 HTTP 请求给 Web 服务器 ,里面包含用户名和密码。Web 服务器验证用户名和密码后,把登录相关的 Cookie 发送给浏览器客户端。

第二步,浏览器客户端再一次访问的时候,会带上 Cookie 。 这样才处于登录状态 ,否则会被服务器跳转到登录页面。

现在用 JMeter 来模拟整个登录过程,那么我们 需要在第一步后 ,用正则表达式提取器把登录相关的 Cooki巳提取出 来 ,然后把登录的 Cookie 插入后续的 HTTP 请求中形成关联。

这里如果用正则表达式来做的话会稍显麻烦。

JMeter 中的 HTTP Cookie 管理器可以自动管理 Cookie 。 有了它,我们就不需要去处理 Cookie 了,HTTP Cookie 管理器会自动存储和发送 Cookie 。

如果 HTTP 响应中包含 Co okie ,那么 HTTP Cookie 管理器会自动保存这些 Cookie 。 用户再次访问该站点时,HTTP 请求会自动使用这些 Cookie 。一个线程组有自己存储 Cookie 的区域,并且一个钱程组只能添加一个 HTTP Cookie 管理器 。

选择线程组,用鼠标右键单击添加 -> 配置元件 -> 添加线程组,HTTP Cookie 管理器里面不需要修改任何字段。

image-20210113013757907

21.2 HTTP 请求默认值

我们在 JMeter 里一般都会添加多个 HTTP 请求,这些 HTTP 请求的 HOST、协议和端口都是一样的。 我们可以添加一个 HTTP 请求默认值,相当于一个模板 。 在 HTTP 请求默认值中设置 HOST、协议、URL、端口等内容,这样后续的 HTTP 请求就会继承 HTTP 请求默认值中的内容。

21.3 禅道介绍和部署

禅道是一个开源的项目 管理系统,集产品管理、项目管理、Bug 管理、文档管理、组织管理和测试用例管理于一体,是一款功能完备的项目管理软件,完美地覆盖了项目管理的核心流程 。很多创业公司都使用禅道。部署禅道非常简单,强烈建议读者自行搭建一个禅道系统,大概 10 分钟就能搭建好。不想自己搭建的话就用我提供的禅道。

image-20210113013945483

我部署的禅道地址是 http://tankxiao.vicp.io/zentao/,用户名是 book,密码是 password。

现在用 JMeter 来实现禅道系统的自动登录,新建一个 Bug ,把这个 Bug 修改为“己修复”,再把这个 Bug 修改为“己关闭”。

21.4 禅道操作和抓包分析

我们一边用浏览器来手动操作,一边用 Fiddler 抓包分析,一边用 JMeter 来实现 ,以此逐步实现整个流程的自动化。

21.4.1 第 1 步,自动登录禅道

具体的操作步骤如下。

  1. 启动 Fiddler,启动过滤。过滤掉一些不相干的 HTTP 请求,能让我们快速找到我们需要的 HTTP 请求。

    在 Fiddler 中的 Filter 选项卡中激活 Filter,并且在 Response Type and size 中选中“ Show only HTML ”。

image-20210113014235045

  1. 启动 Fiddler,打开浏览器,输入 http://tankxiao.vicp.io/zentao,然后输入用户名和密码,单击“ 登录 ” 。

image-20210113014319527

从抓包可以看到 ,登录用 的是 POST 方法,但是密码是加密后发送给服务器 的,Body 中的数据是 account=book&password==5f4dcc3b5aa765d61d8327 deb882cf99。

  1. 确认密码是怎么被加密的 。 该密码估计是用 JavaScript 代码加密 的 。 我们可 以查一下 JavaScript 代码。打开浏览器的开发工具,查找 JS 代码。不出所料 ,我们发现了 一个叫 MD5 的 JS 文件。

    为了 确定该密码是被 MD5 加密的,我们进行一 下测试 。打开 MD5 的在线网站 ,网址是 http://www.md5.cz/,现在可以确定密码是用 MD5 加密的 。

image-20210113014520563

如何实现这个密码的加密呢?有两种方法。

(1)第一种方法,先发送一个请求给 http://www.md5.cz,在 HTTP 响应中,我们用正则表达式把加密后的密码提取出来。这个方法的缺点是:如果网站不可用了,我们的脚本就不能工作了。

(2)第二种方法,用 BeanShell 的方法,用 Java 代码来进行 MD5 加密,把一个 Java 的 jar 包引入进来 。

我们采用第一种方法加密。如果读者想采用第二种方法,可以参考上一章中 BeanShell 的用法。

  1. 启动 JMeter,新建一个线程组,新建一个用户自定义的变量。添加 2 个变量:一个叫 usemame,一个叫 password。

image-20210113014757859

  1. 添加一个 HTTP 请求,命名为 GetMd5

image-20210113014821015

  1. 在 GetMd5 HTTP 请求下面新建一个正则表达式提取器。

image-20210113014853119

  1. 选择线程组,添加一个 HTTP Cookie 管理器,用来自动管理 Cookie 。
  2. 选择线程组,添加一个 HTTP 请求默认值。

image-20210113014927403

  1. 选择线程组,添加一个 HTTP 请求,命名为 login,这个 HTTP 请求就是用来登录的。这是一个 POST 请求,URL 地址是 /zentao/user-login.html,Body
    的数据应该是 account={usemame}&password=${password2}

  2. 添加“ 察看结果树”,并且运行,保存脚本 。

image-20210113015104899

image-20210113015117093

到这一步 ,我们的登录终于做好了,可以看到我们 的密码是用 MD5 加密后发送的。

21.4.2 第 2 步,创建一个新的 Bug

具体操作步骤如下。

  1. 继续在浏览器中操作,在禅道中单击“测试”,单击“ Bug ” ,在右边单击“新建一个 Bug ”,会弹出 一个 Bug 的表单。在表单中填好一些必填字段。

image-20210113015224291

  1. 单击保存,新建一个 Bug 的 HTTP 请求就被 Fiddler 抓到了

image-20210113015242758

我们用 JMeter 也模拟出 一个一模一样的 HTTP 请求

添加一个新的 HTTP 请求,命名为 CreateBug,路径和 Body 的数据我们都从 Fiddler 里面复制过来

image-20210113015310683

在 CreateBug 中新建一个 HTTP 信息头管理器,把 Header 都从 Fiddler 中复制过来,记得一定要删除 Host 和 Cookie 这 2 个 Header

image-20210113015343562

21.4.3 第 3 步,找到刚刚新建 Bug 的 ID

先在 JMeter 中把上一步添加的 CreateBug 请求禁用,以防止创建太多的 Bug。

要修改这个 Bug,我们需要知道刚才所创建的 Bug 的 ID 是多少 。

我们回到 Bug 列表的页面,可以看到,根据 Bug 的标题,可以从这个页面获取到 Bug 的 ID

image-20210113015424490

获取 Bug 列表的 HTTP 请求用的是 GET 方法。在 JMeter 中,新建一个 HTTP 请求,将其命名为 GetBugList

image-20210113015448494

在 GetBugList 请求下面,添加一个正则表达式用于提取 Bug 的 ID。通过正则表达式,我们可以从 GetBugList 的 HTTP 响应中把 Bug 的值提取出来,存到变量 bugid 中 。

image-20210113015510167

21.4.4 第 4 步,修改 Bug 状态为“己解决”

在浏览器中把 Bug 的状态修改为“己解决”。

image-20210113015550612

Fiddler 抓包。

image-20210113015609841

在 JMeter 中新建一个 HTTP 请求,命名为 EditBug。按照上面抓到的包,把 URL 和 body 数据都填好。注意 Bug 的 ID 是动态变化的,
URL 中我们需要使用 ${bugid} 。

image-20210113015636642

在 EditBug 这个 HTTP 请求下面新建一个 HTTP 信息头管理器,从 Fiddler 中把 Header 复制过来,粘贴到 HTTP 信息头管理器中。记得一定要删除 Host 和 Cookie 这 2 个 Header。

21.4.5 第 5 步,关闭 Bug

同样的道理,在浏览器上操作,把 Bug 关闭,Fiddler 抓包,然后用 JMeter 实现 。

image-20210113015737095

21.4.6 总结

整个流程就做完 了,我们可以用 JMeter 实现禅道的自动登录,自动开 Bug,自动修改 Bug 的状态并关闭 Bug 。

同样的道理,我们可以用此方法做接口的自动化测试。除了 JMeter 之外,还可以使用 Postman 来完成 。

参考

《HTTP 抓包实战》