用途
API 契约测试用于验证服务之间的 API 是否遵守既定契约,无需依赖完整的集成测试。它特别适合微服务架构中消费者与提供者之间的通信测试,帮助团队在开发早期发现接口不兼容问题。
主要能力
- 消费者驱动契约测试:从消费者视角定义期望的请求与响应,生成契约。
- 模式校验:基于 OpenAPI、JSON Schema 等结构定义验证请求与响应。
- 提供者验证:提供者根据契约验证自身实现是否符合消费者期望。
- 契约 Broker:集中存储和管理契约,支持版本化与 CI/CD 集成。
- 错误响应测试:覆盖 404 等错误场景,确保异常处理符合契约。
- 向后兼容性验证:在 CI 流程中检查契约变更是否破坏现有消费者。
使用方式
Pact 消费者测试(TypeScript)
使用 @pact-foundation/pact 的 PactV3 定义消费者与提供者,通过 given、uponReceiving、withRequest、willRespondWith 描述交互,并使用 MatchersV3 进行灵活匹配。示例中定义了获取用户成功(200)与不存在用户(404)两种场景,并通过 executeTest 对 mock server 发起请求进行断言。
提供者验证
使用 Verifier 配置提供者名称、基础 URL、Pact Broker URL、发布验证结果、提供者版本以及状态处理器(stateHandlers),通过 verifyProvider() 执行验证。状态处理器用于准备测试所需的数据状态,例如创建用户或清空用户表。
OpenAPI 校验(Express)
使用 express-openapi-validator 中间件,指定 apiSpec 为 OpenAPI 文件路径,开启 validateRequests、validateResponses、validateSecurity 以校验请求、响应与安全性。
其他实现
- Python JSON Schema:参见 references/python-json-schema.md
- Java REST Assured:参见 references/java-rest-assured.md
- Pact Broker CI/CD:参见 references/pact-broker-cicd.md
适用场景
- 微服务之间 API 通信的契约验证。
- 需要在不运行完整集成测试的情况下验证接口兼容性。
- 在 CI 流水线中自动检查契约变更与向后兼容性。
- 使用 OpenAPI/Swagger 进行模式优先(schema-first)的 API 校验。
最佳实践
应做:
- 从消费者视角测试。
- 使用匹配器进行灵活匹配。
- 验证结构而非具体值。
- 显式地对契约进行版本管理。
- 测试错误响应。
- 在 CI 流水线中运行测试。
- 测试向后兼容性。
不应做:
- 在契约中测试业务逻辑。
- 硬编码具体值。
- 跳过错误场景。
- 忽略版本管理。
- 未经验证就部署。
工具
- Pact:多语言消费者驱动契约测试工具。
- Spring Cloud Contract:JVM 生态的契约测试工具。
- OpenAPI/Swagger:模式优先的校验工具。
- Dredd:API Blueprint 测试工具。
- Spectral:OpenAPI 静态检查(linting)工具。
限制
资料中未提供关于收费、价格、平台支持范围、性能指标或具体使用步骤的更多信息。