自动化测试
一、接口定义
软件不同部分之间的交互接口。通常就是所谓的 API――应用程序编程接口,其表现的形式是源代码。 —— [ 百度百科 ]
我们常说的接口一般指两种:
- API:应用程序编程接口。程序间的接口
- GUI:图形用户界面。人与程序的接口
这里我们所说的接口特指 API 接口。API 接口定义:对协议进行定义的引用类型。
好多公司开发人员分前后端,他们之间如何配合工作的,就是其中一方定义接口,另一方来调用接口,以实现预期功能。
二、接口的分类
1. 接口分类
- HTTP 接口
- Webservice 接口
- RESTful 接口
WebService 接口是走 soap 协议,请求报文和返回报文都是 xml 格式,通过 SoapUI 工具进行测试;
HTTP API 接口走 HTTP 协议,通过路径来区分调用的方法,请求报文入参有多种形式,返回报文一般为 json 串,最常见的是 get 和 post 方法。
三、为何要进行接口测试
1. 接口测试必要性
当今的系统复杂度不断上升,传统的测试方法成本急剧增加且测试效率大幅下降,所以就要做接口测试。
同时,接口测试相对容易实现自动化持续集成,且相对 UI 自动化也比较稳定,可以减少人工回归测试人力成本与时间,缩短测试周期,支持后端快速发版需求。
接口持续集成是为什么能低成本高收益的根源。现在很多系统前后端架构是分离的,从安全层面来说,只依赖前端进行限制已经完全不能满足系统的安全要求(绕过前面实在太容易), 需要后端同样进行控制,在这种情况下就需要从接口层面进行验证。
前后端传输、日志打印等信息是否加密传输也是需要验证的,特别是涉及到用户的隐私信息,如身份证,银行卡等。
2. 接口测试原理
模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做处理并向客户端返回应答,客户端再接收应答的一个过程。
3. 接口测试范围
接口的功能、性能、安全性。重点关注数据的交换,传递和控制管理过程,还包括处理的次数。
接口测试对象是接口,但随着系统复杂度越来越高,接口越来越多,完全覆盖是一件很困难的事情。
通常情况下主要测试最外层的两类接口:数据进入系统的接口(调用外部系统的参数为本系统使用)、数据流出系统接口(验证系统处理后的数据是否正常)
四、接口文档示例
1. 接口文档应该包括哪几部分?
- 接口说明
- 调用的 url
- 请求方法(get、post)
- 请求参数,参数类型、请求参数说明
- 返回参数说明
- 返回示例
2. 示例
注:上图接口文档工具为 ShowDoc
五、Postman 工具简介
1. Sidebar 侧边栏
Postman 侧边栏允许你查找、管理请求和集合。侧边栏分为两个主要的选项卡,包括历史和集合选项卡。可以拖动右边的边来调整侧边栏的宽度。侧边栏也可以隐藏到小屏幕(标题栏 view—>toggle side bar)。
(1)历史选项卡
通过 Postman 应用程序发送的每个请求都保存在侧边栏的 History 选项卡中。
(2)集合选项卡
在侧栏中创建和管理集合选项卡的集合。
2. Header toolbar
Postman 的顶部工具栏包含以下选项:
- 新建按钮——可以新建请求,集合,环境等
- 运行按钮-打开集合运行页面
- 导入按钮——导入 Postman 文件、文件夹、form link 等
- 新窗口图标-打开一个新的 tab 页、新的窗口、新的 runner 等
- 构建器和团队库选项卡——在请求生成器和 Team Library 视图之间切换
- 抓取 API 请求图标——使用 postman 抓取 API 请求
- 同步状态图标——同步 API 请求图标
- 用户下拉——管理集合链接和你的个人资料或登录 / 登出,你的 Postman 帐户
- 开放 API 集合(点击打开一个网址)
- 通知图标-接收通知或广播
- 设置图标——管理 Postman 应用程序设置,并找到其他支持资源
- ❤——分享按钮
3. Builder
Postman 通过选项卡布局,用于在构建器中发送和管理 API 请求。上半部分是请求构建器,下半部分是响应查看器。
- Cookies——管理 cookie 模式是通过点击 cookie 链接访问的。该特性允许你管理与请求相关的 cookie。
- Code——生成的代码片段模式通过保存按钮下面的最右边的 Code 链接。该特性允许你生成与请求相关的代码片段,该请求支持 20 多种语言(http、java、go 等语言)
4. Console
Postman 有两个控制台,可以帮助我们了解系统后台到底发生了什么。
- Postman Console——包含 HTTP 请求和响应的运行日志。来自脚本的日志消息 (如在 console. Log 中)。这个功能只能在 Postman 的本地应用中使用。
- DevTools Console——可以在开发期间记录诊断信息。
六、借助 Postman 完成 HTTP 请求接口测试
1. 借助 Postman Echo 演示下各种请求的构建方法
(1)Get 请求
https://postman-echo.com/get?foo1=bar1&foo2=bar2
HTTP GET 请求方法是从服务器检索数据。数据由惟一 URI(统一资源标识符) 标识。GET 请求可以使用 “查询字符串参数” 将参数传递给服务器。例如,在下列请求中,http://example.com/hi/there?hand=wave,参数 “hand” 的值等于 “wave”。
(2)POST:URI 传参
(3)POST:Form-data 传参
(4)POST:x-www-form-urlencoded 传参
(5)POST:raw 传参
(6)POST:binary 传参
(7)Authentication Method——权限认证方法
- GET Basic Auth
- 增加 auth 信息:
- DigestAuth
- Hawk Auth
- OAuth1.0(verify signature)
(8)Headers——添加 header
2. 接下来,我们拿个开放 API 来演示下单一接口测试流程
示例 API:https://developers.douban.com/wiki/?title=book_v2#get_book
步骤一:使用 Postman 工具发送该 Get 请求,如下图。
步骤二:添加测试。
上图针对该 API 添加了 3 个测试:
- 要求响应时间小于 200ms
- 要求 status code 等于 200
- 要求 Response body 中包含字符串 “金庸”
注:当然你还可以增加更多的测试点。
七、Postman Newman Jenkins 实现接口自动化测试
1. 准备工作(具体步骤参考附件文档-作者提供)
(1)安装 Newman 工具
- 安装 Node.js
- 安装 Newman
- 查看 Newman 命令
(2)部署 Jenkins
2. 将接口保存到集合
点击 Save 按钮,将接口保存到一个集合(可以保存到一个现有集合中或者新建一个集合),如下图:
3. 将集合保存到本地
将集合保存到本地,文件为 .json 格式,如下图:
4. 命令行通过 Newman 运行集合
(1)打开命令行窗口,运行如下命令:
D:git-local>newman run MyCollection1.postman_collection.json -g globals.postman_globals1.json
(2)执行结果如下:
可以看到,其中两条断言 passed,一条断言 failed,失败的原因是,我们期望接口响应时间小于 200 ms,但是本次接口请求响应时间是 270 ms。
5. 通过 Jenkins 调用 Newman,执行接口测试
执行一次构建,构建失败(上面的断言失败,我们并未修复),查看构建失败原因。
6. 假设开发修复了接口 bug
接口响应时间减少了,我们需要回归测试。(我们将断言响应小于 200 ms,修改成 1000 ms,让断言 passed)
7. 演示一个如何调用 data file 参数化用例
我这里有一个集合,3 个接口,第一个接口为登录接口,第二个接口为获取登录用户信息接口,第三个接口为修改密码接口。登录接口如下:
测试脚本如下:
参数化 json 文件内容如下:
代码语言:javascript复制[{
"loginName": "duzl", "password": "admin123", "verifyCode": "adf", "value": "/index"
}, { "loginName": "duzl", "password": "admin", "verifyCode": "adf", "value": " 账号或密码错误 "
}, { "loginName": "duzl", "password": "", "verifyCode": "adf", "value": " 参数 password 不能为空 "
}]
(1)好我们调用 json 文件,执行下集合,结果如下:
结果还不错,执行了 3 次,参数都是取自用例文件(json 文件),断言也取自用例文件。
美中不足的是,第二个和第三个接口也跟着迭代了 3 次(这并不是我们期望的结果),这是因为集合运行器中的迭代次数是针对所有接口的设置。
(2)那如果,我们想第一个接口运行 3 遍,第二、三个接口只运行一遍,该如何做呢?Postman 给我们提供了一个内置方法,设置接口运行顺序postman.setNextRequest('');
。
注意:迭代次数从 0 开始。
当迭代次数 !==0 时,就停止本次迭代(意思就是,第一次迭代全运行,第二次迭代开始就不执行第二、三个接口了),好,再次运行集合,看看结果:
很好,第一次迭代,执行了 3 个接口;第二、三次迭代只执行了第一个接口。
本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名 最后编辑时间为: 2022/04/01 21:27