返回

微服务 BFF 之 mest 保障前后端接口契约

前端

对于一个微服务架构的后端,对外提供的是各种各样契约约束的接口。变化是永恒的主题,接口变化在所难免。然而,接口一旦发生变化,后端开发人员在提交代码前都必须小心翼翼,否则很有可能会引发一场 "破坏性" 的事故。前端项目可能会构建失败,测试脚本可能会跑不起来,线上系统甚至会莫名其妙地崩掉。

想象一下,这样一个需求场景:

我们有一个 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)是一个优秀的解决方案,它为我们提供了高效、灵活的序列化方式,以及跨平台、跨语言的接口定义方式。

但它也有一个缺点:缺乏版本控制

mestm icroservice e ndpoint s ervice t est)是一个基于 protocol buffers 的测试工具,它提供了对 protobuf 接口进行版本控制的功能。

契约测试

契约测试 指的是对前后端接口进行自动化测试,以确保接口符合预期的行为。

使用 mest 进行契约测试,可以对前后端接口进行以下测试:

  • 语义检查 :检查接口的输入和输出是否符合 protobuf 定义
  • 版本检查 :检查接口的版本是否与预期一致
  • 兼容性检查 :检查接口的新旧版本是否兼容

如何使用 mest 进行契约测试

使用 mest 进行契约测试,需要以下步骤:

  1. 安装 mest 工具
  2. 创建一个 .mest 文件,用于定义契约测试
  3. 编写测试用例
  4. 运行测试

下面是一个简单的 .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 进行契约测试,可以帮助我们有效保障前后端接口的契约。它可以在接口发生变化时快速发现问题,降低接口不兼容的风险,从而提高系统的稳定性和可靠性。