接口测试 自制一款简单的 Bash 脚本 +HTTP 请求工具 +JSON 解析工具组成的测试小工具

数人云 · 2016年11月01日 · 1842 次阅读

前方高能,文末有彩蛋 :)

近期,数人云开源一款容器管理工具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 的基本用法

1. 例子说明如何使用 httpie

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 来判断返回值。

2. 例子说明如何使用 jq

下面我们用几个例子介绍一下 jq 的用法。

上图演示如何提取一个 json 的 key。


如何提取一个嵌套的 key。

提取数组中的元素。

篇幅关系我们不过多展示 jq 的高级功能, 除了基本的解析和构造以外,jq 支持大量的 filter, 如有兴趣可参考 https://stedolan.github.io/jq/manual/#Builtinoperatorsandfunctions

3. Crane 测试工具的几个场景

场景一: 我期望测试 API 的 HTTP 测试的返回状态比如 200, 404, 500
首先 bash 造了几个基本的函数来输出错误, 和判断状态

使用方法

场景二: 登录过程测试

更多的测试例子可参考https://github.com/Dataman-Cloud/crane/tree/master/api_test

至此,一款可用的测试工具出炉了, 虽然很简陋,不过功能恰到好处,非常适合我们的场景, 再也不怕 API 出错发现不了了。 聪明的同事们把这工具配到了 jekins 和单元测试一起执行, 出错了还能得到邮件通知, 帅的不行不行的。

同时,数人云容器管理工具Crane期待大家贡献 Star&Fork,凡贡献 Star 并在下方评论的同学,6#,36#,66# 可获得《大话 APP 测试 2.0 : 移动互联网产品测试实录》,重复评论和讨论只计算一次噢:)

共收到 17 条回复 时间 点赞

看阅读数挺高的,但评论数为 0,我坐沙发算了.不知道 #1 评论楼主是否也含有一个隐藏奖----.我已经点赞,mark,star 了 github 项目.😀 😀 😀 😀

这个工具不错,简单实用,可以用于接口测试,我用的比较多的是 curl,jq 格式化 json.都还挺好用的.

匿名 #2 · 2016年11月01日

不错,省了自己去封装了,而且还蛮清晰的

我最近也在想接口测试的时候, 生成的测试用例支持 curl+jq 的组合. 没想到你们竟然做了尝试了. 不错

#1 楼 @langmu 如果十天之内还是没有产生第 6 个评论,那就送你一本喽:)

#3 楼 @seveniruby 谢谢大神夸奖😝

弱弱的问一句,msg 命令是啥?我怎么没有搜到 linux 有这个命令?

#6 楼 @zhouhuang msg 是个 bash 函数

#7 楼 @shurenyun 是需要安装么?我执行脚本三个地方都报错了,我之前没有用过 shell

#5 楼 @shurenyun 如果么有广告, 我就加精华帖了 😅

#9 楼 @seveniruby 你可以先加,等书送完我就把活动去掉,好不好🙋

#10 楼 @shurenyun 名利双收的事情哪有这么多... . 等以后再写好文章吧.

#11 楼 @seveniruby 那现在直接撤销吧,还好没有到 6 个人评论

#12 楼 @shurenyun 我是不是在六楼哇

#12 楼 @shurenyun 别撤销 .文章重发也不算的. 以后再写好文章吧. 这文章里面的技术还是有改进空间的.

#4 楼 @shurenyun 如果十天之内还是没有产生第 66 个评论,那就送你一本喽:)😀 😀 😀 😀

简单易懂,厉害,对健壮性和稳定性来说,$? == 0 就够了。还在纳闷为啥不加精呢?😂

匿名 #17 · 2016年11月16日

开源的小工具

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册