反骨仔

一个业余的 .NET Core 攻城狮

0%

当今我们正处于互联网时代,特别是移动互联网 时代 。 大量的程序都是以 APP 或者 Web 的形式提供给用户使用。 测试人员现在主要测试的是 APP 或者 Web 端 。按照架构程序可以分为前端和后台。有的测试人员测试前端,有的测试后台。学好了 HTTP 协议和 Fiddler,可以将其应用到后台的自动化测试和接口的自动化测试。

阅读全文 »

我们在使用 JMeter 的时候,有时候会需要一些逻辑的运行,对此 JMeter 就有些乏力了。可以在 BeanShell 中通过 Java 代码来扩展功能。

20.1 什么是 BeanShell

BeanShell 是一个小型的 Java 源代码解释器,具有对象脚本语言特性。其能够动态执行标准 JAVA 语法,可以通过脚本来处理 Java 应用程序,还可以执行 JAVA 代码和 Java 代码片段,以及松散类型的 Java 和其他的脚本。BeanShe ll 是一种完全符合 Java 语法规范的脚本语言,并且拥有自己的一些语法和方法。

20.2 操作变量

通过使用 Bean shell 内 置对象 vars 可以对变量进行存取操作。

vars.get(”name”):从 JMeter 中获得变量值。

vars.put("key”,”value"):数据存到 JMeter 变量中 。

新建一个线程组,添加一个 BeanShell Sampler,添加一个 Debug Sampler 和一个“ 察看结果树。

image-20210113010051381

在“ 察看结果树”中,我们可以通过 Debug Sampler 来查看变量的值。

image-20210113012931725

20.3 JMeter 有哪些 BeanShell

JMeter 中包括多种 BeanShell, 用法基本都是一样的,只是作用的地方不同而己,可以都尝试一下看看 。

定时器 :BeanShell Timer 。

前置处理器 :BeanShell Pr巳Processor 。

采样器 :BeanShell Sampler 。

后置处理器:BeanShell PostProcessor 。

断言:BeanShell 断言。

监听器:BeanShell Listener 。

20.4 BeanShell 调用自己写的 jar 包进行 MD5 加密

具体操作步骤如下。

  1. 先在 Eclipse 中新建一个工程 ,工程名随便取
  2. 在工程中添加一个 class,class 名称叫 md5,代码如下:

image-20210113013138656

image-20210113013152112

  1. 将工程导出为一个 jar 文件,取名为 mymd5.jar
  2. 新建另 一个工程,取名为 mdStest,引入 mymd5.jar。测试一下 jar 包,确保 jar 包能被正确调用。允许成功后,说明 jar 包是可用的

image-20210113013244677

  1. 将 mymdS.jar 复制到 JMeter 文件中的 apache-jmeter-3 .2\lib \ext 下面
  2. 启动 JMeter ,在测试计划中引入这个 jar 包

image-20210113013322558

  1. 几位ter 中新建一个线程组,线程组中新建一个 BeanShell Sampler

  2. 在线程组下面添加一个 Debug Sampler。

  3. 在线程组下面添加一个察看结果树

image-20210113013401765

image-20210113013414818

参考

《HTTP 抓包实战》

本章介绍如何使用 Fiddler 抓包分析网站的登录过程,并且使用 JMeter 实现网站的自动登录,从而实现自动化测试以及性能测试。

22.1 案例介绍

本章介绍如何给网站做压力测试,使用的是一个叫 Mozy 的网站。

其登录页面是 https://secure.mozy.com/login ,用户名是 246460253l@qq.eom ,密码是 tanJαiao1234。

建议读者注册自己的账号来完成本次操作,注册网址是 https://secure.mozy.com/registration/ee。

性能测试的脚本其实就是自动化测试。

22.2 压力测试的目的

模拟 20 个用户同时登录 Mozy 网站进行操作,然后查看性能指标,比如响应时间和出错率。

22.3 抓包分析 Mazy 网站的登录过程

  1. 启动 Fiddler,打开浏览器,打开 https://secure.mozy.com/login,输入用户名 246460253 l @qq.eom 和密码 tankxiao 1234

Fiddler 能抓到很多包,找到那个有用户名和密码的包

image-20210113020434373

抓包可以看到,浏览器用 POST 方法发送了如下数据给服务器 :

1
authenticity _token司~K4Ig6s3j57plJ%2F5rWGCXDVFbr6时L1也uyklxbwDHU%3D&山em缸ne=2464602531%40qq.com&password=tankxiao1234

除 了用户名和密码外,还有一个 authenticity_token 。 这个 authenticity_token 是从哪里来的呢?(如果 authenticity_token 每次都变化,说明服务器会验证对其进行)

  1. 查找 authenticity_token 的来源。在 Fiddler 中,按快捷键【Ctrl+F】 来查找

查到的 Session 会用黄色的背景显示,我们得知这个 authenticity_token 是从 https://secure.mozy.com/login 这个页面的响应中来的

image-20210113020958743

image-20210113021007289

22.4 抓包分析

通过上面的抓包分析,我们可以总结出整个过程如下 。

  1. 发一个 GET 的 HTTP 请求到 https://secure.mozy.com/l。但是,在这个页面的 HTTP 响应中,用正则表达式提取到 authenticity_token 的值。
  2. 发一个 POST 的 HTTP 请求到 https://secure.mozy.com/login,Body 的数据包含 authenticity_token ,用户名和密码,从而实现了登录。
  3. 访问 https://secure.mozy.com/,可以看到己经是登录的状态。

22.5 实现 Mazy 登录

具体的操作步骤如下 。

  1. 启动 JMeter,新建一个线程组,添加 一个 Cookie 管理器 ,添加 一个“ 察看结果树”
  2. 在线程组下面新建一个 HTTP 请求,命名 为 loginPage

image-20210113021151329

  1. 保存脚本后运行,得到登录页面的 HTTP
  2. 使用 正则表达式工具 。 写一个获取 authenticity_token 的正则表达式 。正则表达式字符串是 authenticity_token ” type=”hidden” value="(*.?)”,
  3. 在 loginPage 这个 HTTP 请求下面添加一个正则表达式提取器,通过正则表达式提取器把 authenticity_token 的值提取出来,保存在变量 token 中。
  4. 在线程组下面新建一个 HTTP 请求,命名 为 login。

image-20210113021246074

image-20210113021256480

image-20210113021308365

  1. 在线程组下面新建一个 HTTP 请求,命名为 homePage。

image-20210113021327540

22.6 简单的压力测试

用 JMeter 很容易模拟压力测试。在线程组中,将线程数改为 5,代表同时有 5 个用户:循环次数是 10,代表每个用户循环 10 次。

image-20210113021358181

在线程组中添加一个聚合报告,然后运行脚本,就能看到性能测试的结果。

image-20210113021416434

我们通过聚合报告来分析性能测试的结果。

  1. Error% :本次测试中出现错误请求的数量。正常情况下应该是 0.00%。否则就是功能出现了问题。也就是当大量用户访问的时候,造成了功能失败的问题,这个问题很严重。
  2. Average :平均响应时间,单位是 rns。对于一个 HTTP 请求来说,响应时间应该在 200rns 之内,但是图中 login 的平均响应时间是 5 492rns ,说明性能非常差。

参考

《HTTP 抓包实战》

“禅道”是一个国产的开源项目管理软件,支持需求管理、任务管理、缺陷管理和测试用例管理。本章将综合之前所学的知识,包括 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 抓包实战》