契约测试(Contract Testing)是微服务架构中验证服务提供方和消费方之间接口兼容性的测试方法。与传统的集成测试不同,契约测试不需要启动完整的微服务集群,而是通过在消费者端定义期望、在提供者端验证期望来确保双方对 API 的认知一致。
在银行等金融场景中,服务间的接口变更可能导致严重的生产事故,契约测试能够在 CI/CD 流水线中快速发现接口兼容性问题,是微服务测试体系的关键一环。
契约测试Pact消费者驱动接口兼容性| 模式 | 描述 | 适用场景 |
|---|---|---|
| 消费者驱动契约 (CDC) | 消费者定义期望的请求/响应格式,生成契约文件供提供者验证 | 消费者与提供者独立演进场景 |
| 提供者驱动契约 | 提供者发布 OpenAPI/Swagger 规范,消费者根据规范生成测试 | 提供者接口较为稳定,消费者适配的场景 |
| 双向契约测试 | 消费者和提供者各自维护期望,双方在 CI 中进行相互验证 | 服务间存在严格 SLA 的金融场景 |
Pact:目前最流行的消费者驱动契约测试框架,支持 Java、JavaScript、Go、Python 等主流语言。通过 Pact Broker 集中管理契约文件,实现契约的版本控制和自动验证。
Spring Cloud Contract:适用于 Spring 生态的契约测试方案,支持通过 Groovy DSL 或 YAML 定义契约,与 Spring Boot 应用无缝集成。
OpenAPI/Swagger:提供者方的 API 文档即契约,消费者可以使用工具生成对应的 Mock Server 和测试用例。
| 测试类型 | 测试范围 | 执行速度 | 维护成本 |
|---|---|---|---|
| 单元测试 | 单个函数或类 | 极快(毫秒级) | 低 |
| 契约测试 | 服务间接口契约 | 快(秒级) | 中 |
| 集成测试 | 多服务协同 | 较慢(分钟级) | 高 |
| 端到端测试 | 全链路业务流程 | 慢(分钟级) | 很高 |
契约测试在速度、覆盖率和维护成本之间取得了最佳平衡,是微服务测试体系中最具性价比的测试类型。