近期,数人云开源一款容器管理工具Crane,Crane
开发过程中,为了保证 API 的健壮性和稳定性, 开发团队自己造轮子捣鼓了一套适合 Crane API 测试的小工具。
针对 Crane 团队只向外输出 API 的特点, 笔者选择测试工具是秉着以下原则的,
- 第一, 功能不要太复杂,学习曲线不能太陡, 功能够用就行;
- 第二, 可编程要好, 最好不要有界面,程序员友好。 经过短时间 google, 笔者发现还是自己简单造个轮子比较合适。 于是一款简单的 Bash 脚本 +HTTP 请求工具 +JSON 解析工具组成的测试小工具雏形出现了。
Bash 脚本: 测试工具的粘合剂, 不是 Java 也不是 Python, 用 Bash 简单易用,功能强大。
Httpie: 一款类似 curl 的 http 工具, 不过比 curl 简单的多, 尤其想发个 JSON 请求时候, 更简单。
jq: jq 是一款命令行解析 JSON 文本的工具, 支持非常多的语法解析构造重组 JSON 文本。
Bash 脚本无需多讲, 下面依次给大家介绍一下 httpie 和 jq 的基本用法
httpie 在 terminal 下的命令是 http, 先来几个简单的例子给演示一下用法。
http get http://httpbin.org/get header:header-content
其中, http 是命令, get 是请求 method, http://httpbin.org 是请求地址, httpbin 是一个 http 的测试服务; 用冒号相连的参数代表着 HTTP 请求头, 用等号连接为请求 body 中的 JSON 键和值。 httpie 默认的请求为 json 请求, 所以不用过多指明,header 已经加上了 Content-Type:application/json。
http 支持很多命令行选项, 介绍一个有意思的是 --check-status, check-status 是把 http response 的非 200 值设置成进程的 exit code, 比如:
http post http://httpbin.org/post header:header-content json-key=json-value
http 支持很多命令行选项, 介绍一个有意思的是 --check-status, check-status 是把 http response 的非 200 值设置成进程的 exit code, 比如:
如上所示, 请求一个不存在的地址时候进程退出符号变成了 4。 我们将大量使用这个 feature 来判断返回值。
下面我们用几个例子介绍一下 jq 的用法。
上图演示如何提取一个 json 的 key。
如何提取一个嵌套的 key。
提取数组中的元素。
篇幅关系我们不过多展示 jq 的高级功能, 除了基本的解析和构造以外,jq 支持大量的 filter, 如有兴趣可参考 https://stedolan.github.io/jq/manual/#Builtinoperatorsandfunctions。
场景一: 我期望测试 API 的 HTTP 测试的返回状态比如 200, 404, 500
首先 bash 造了几个基本的函数来输出错误, 和判断状态
使用方法
场景二: 登录过程测试
更多的测试例子可参考https://github.com/Dataman-Cloud/crane/tree/master/api_test 。
至此,一款可用的测试工具出炉了, 虽然很简陋,不过功能恰到好处,非常适合我们的场景, 再也不怕 API 出错发现不了了。 聪明的同事们把这工具配到了 jekins 和单元测试一起执行, 出错了还能得到邮件通知, 帅的不行不行的。