要写出一个健壮的程序必须要有测试,测试可以保证上线的代码功能符合预期,防止上线后出现莫须有的损失。对于我们一口气写完的api,匆忙上线往往会导致很糟糕的后果。
那么怎么去写测试来保证我们的api上线后是没问题且符合预期的呢?一个后台工程师为了不背锅,如何去需要保证自己的工作完成得没问题呢?
注意:我们这里讨论的是api符合预期,对于客户端ui显示,不在我们讨论范围内。
我觉得要做好api测试,至少有以下三点:
- 测试案例的返回结果符合预期
- 测试案例覆盖了所有代码条件
- 测试案例的结果数据符合预期
简单的说就是,充分理解业务的情况下,编写出完整的测试案例集,然后通过测试案例集验证了返回结果以及存储数据的准确性。这就是保证api正确的核心。
根据这样的想法,于是编写了一个测试框架 Guardian。Guardian 的使用非常简单,你只需要把你的测试案例信息写成固定的json格式,包括请求信息,预期响应信息,预期的数据信息。然后运行命令,guardian 就会帮你跑完所有测试案例,并验证最终的结果返回输出到终端中。
使用如这个例子:
guardian --tests=./example/tests/entrance.json
SUIT: users
=================================================
获取用户 Ok
-------------------------------------------------
响应比对 ✓️
数据比对 ✓️
=================================================
修改用户 Ok
-------------------------------------------------
响应比对 ✓️
数据比对 ✓️
=================================================
Ok
SUIT: orders
=================================================
获取订单 Ok
-------------------------------------------------
响应比对 ✓️
数据比对 ✓️
=================================================
创建订单 Ok
-------------------------------------------------
响应比对 ✓️
数据比对 ✓️
=================================================
Ok
json文件格式
入口文件
选项名 | 子选项名 | 描述 | 格式 | 是否必须 | 例子 |
---|---|---|---|---|---|
database | port | 端口 | 字符串 | 是 | 3306 |
user | 用户 | 字符串 | 是 | root | |
password | 密码 | 字符串 | 是 | root | |
charset | 字符集 | 字符串 | 是 | utf8 | |
host | 地址 | 字符串 | 是 | 127.0.0.1 | |
database | 数据库名 | 字符串 | 是 | guardian | |
tables | 无 | 案例集 | 对象 | 是 | { “users”: [ “users/get.json”, “users/post.json” ], “orders”: [“orders/get.json”,”orders/post.json”] } |
vars | 无 | 全局变量 | 对象 | 否 | { “host”: “http://127.0.0.1:1235” } |
debug | 无 | 设置为true则会 打印所有返回结果 与数据库查询结果 | 布尔 | 否 | false |
测试案例
选项名 | 子选项名 | 描述 | 格式 | 是否必须 | 例子 |
---|---|---|---|---|---|
info | title | 标题 | 字符串 | 是 | 这是一个标题 |
description | 描述 | 字符串 | 是 | 这是一个描述 | |
concurrent | 无 | 并发数 | 整数 | 否 | 1 |
request | url | url | 字符串 | 是 | {{host}}/user |
method | 方法有:json, get, post, delete, options, formget, formpost | 字符串 | 是 | get | |
params | 参数 | 对象或数组 | 否 | {“id”: 1} | |
header | 头部 | 对象 | 否 | {“token”: “1231313”} | |
response | body | 返回body数据,对象中可以有 通配符,如”*”,表示不匹配 | 字符串或对象 | 是 | 123 |
header | 头部 | 对象 | 否 | {“token”: “1231313”} | |
data | 无 | 验证数据 | 数组 | 否 | [ { “sql”: “select name from user where id = 1”, “result”: [{“name”: “jack”}] } ] |
具体可以参考: