做一个没有感情的用例生成机器
最近我们准备把一些服务从一个二次开发的 k8s 平台迁移到另一个二次开发的 k8s 平台去,这时候我们遇到了一个比较棘手的问题:因为迁移是有损的,也就是说迁移的过程中伴随着一定量的代码修改和容器编排方式的适配,那么我们如何保证服务迁移以后的功能是正常可用的呢?
想了一些方法,这些办法其实比较常见:
- 增加监控指标和告警指标,迁移后如果服务有问题那么这些指标会让我们尽可能快的发现问题;
- 增加自动化的测试用例,通过用例尽可能的对现有服务功能进行覆盖;
那么问题就来了,如何用最低的成本去实现这些自动化用例呢?
首先我们应该选择合适类型的自动化用例,目前我们可以实现的用例有
- 单元测试用例,实现成本高,但是运行成本低,运行速度快,服务没有启动的情况下也能跑,如果有的选,那么单元测试用例是首选;
- 接口级的测试用例,实现成本相对较低,运行成本高,需要服务跑起来才能进行测试,运行速度相对单元测试是慢一些的;
- ui 自动化测试用例,实现成本高,运行成本也高,运行速度也慢;
最终我们选择增加一些核心的单元测试用例和 ui 自动化用例,然后尽可能多写接口测试用例。
我们的服务实现了一些微服务化,请求从最前面接入层进来之后会到 http 层,该层会调用更下层的 rpc 微服务层实现具体的业务逻辑,因此我们的接口就有两种,分别是
- http 接口,客户端直接调用
- rpc 接口,http 层以及微服务之间进行调用
因为业务逻辑往往需要多次的 rpc 调用才能实现,所以直接写 http 层的接口测试用例相对来说是一种比较经济的方式,因为一次的 http 接口调用会产生多次的 rpc 调用,从业务逻辑上和服务的触达性上来说都是令人满意的。
那么怎么去用尽可能最低的成本去实现这些 http 接口的用例呢?我之前有过使用 postman 把自己变成一个没有感情的用例生成机器的经历,在这里可以给大家分享一下。
举一个具体的例子,看这个接口。
POST /api/users
请求
{
"user":{
"username": "Jacob",
"email": "jake@jake.jake",
"password": "jakejake"
}
}
响应
{
"user": {
"email": "jake@jake.jake",
"token": "jwt.token.here",
"username": "jake",
"bio": "I work at statefarm",
"image": null
}
}
这是一个用户注册的 POST 接口,需要向后端传 json 类型的数据,我们可以看成是传递一个 user 对象,这个对象有 username, email 和 password 属性,用 json 字符串的形式表达出来而已。
