微服务 BFF 之 mest 保障前后端接口契约
2024-02-22 16:29:13
对于一个微服务架构的后端,对外提供的是各种各样契约约束的接口。变化是永恒的主题,接口变化在所难免。然而,接口一旦发生变化,后端开发人员在提交代码前都必须小心翼翼,否则很有可能会引发一场 "破坏性" 的事故。前端项目可能会构建失败,测试脚本可能会跑不起来,线上系统甚至会莫名其妙地崩掉。
想象一下,这样一个需求场景:
我们有一个
CreateOrder
接口,用于创建订单。原来接口的定义是string user_id, string order_id
,现在,需求人员提出,在创建订单时需要添加一个int discount
字段。
按照惯例,我们需要修改 .proto
文件,并且重新生成代码:
syntax = "proto3";
package example.proto;
// 以下为 CreateOrder 请求体
message CreateOrderRequest {
string user_id = 1;
string order_id = 2;
int discount = 3;
}
这样一个小的需求变动,前后端却需要做一大堆繁琐的事情:
- 后端重新编译、生成代码
- 前端重新构建代码
- 测试人员重新调整测试脚本
- 运维人员重新部署服务
而且,整个过程中,时刻都面临着接口不兼容的风险。
mest
协议缓冲(Protocol Buffers)是一个优秀的解决方案,它为我们提供了高效、灵活的序列化方式,以及跨平台、跨语言的接口定义方式。
但它也有一个缺点:缺乏版本控制 。
mest
(m icroservice e ndpoint s ervice t est)是一个基于 protocol buffers 的测试工具,它提供了对 protobuf 接口进行版本控制的功能。
契约测试
契约测试 指的是对前后端接口进行自动化测试,以确保接口符合预期的行为。
使用 mest
进行契约测试,可以对前后端接口进行以下测试:
- 语义检查 :检查接口的输入和输出是否符合 protobuf 定义
- 版本检查 :检查接口的版本是否与预期一致
- 兼容性检查 :检查接口的新旧版本是否兼容
如何使用 mest 进行契约测试
使用 mest
进行契约测试,需要以下步骤:
- 安装
mest
工具 - 创建一个
.mest
文件,用于定义契约测试 - 编写测试用例
- 运行测试
下面是一个简单的 .mest
文件示例:
# .mest 文件用于定义契约测试
# 测试用例的名称
test_case: create_order
# 前端使用的接口版本
frontend_version: 0.1.0
# 后端实际提供的接口版本
backend_version: 0.2.0
# 定义测试用例
tests:
- request:
user_id: "test_user"
order_id: "test_order"
discount: 0
response:
code: 0
message: "success"
mest 的优势
使用 mest
进行契约测试,具有以下优势:
- 自动执行 :可以自动执行契约测试,减少人工测试的工作量
- 全面覆盖 :可以对接口的各个方面进行全面测试
- 快速反馈 :可以在接口发生变化时快速发现问题
- 降低风险 :可以有效降低接口不兼容的风险
总结
使用 mest
进行契约测试,可以帮助我们有效保障前后端接口的契约。它可以在接口发生变化时快速发现问题,降低接口不兼容的风险,从而提高系统的稳定性和可靠性。