规范必须可执行
只生成一次、从不测试的 OpenAPI 文件只是文档,不是契约。Lint 能发现未解析引用和错误模式;基于属性的测试更进一步:从规范生成请求、发送给真实服务,并检查响应是否符合文档中的状态码和结构。不一致要么是实现缺陷,要么是契约过期,两者都需要处理。
npx @redocly/cli lint openapi.yaml
schemathesis run openapi.yaml --url http://localhost:3000 --checks all
对一次性服务运行
使用已播种的测试数据库,并用与规范相同提交构建的服务。对生产运行会让生成的破坏性请求影响真实数据。为受保护路由配置认证,排除依赖第三方回调的操作。设置随机种子以便复现失败,并限制生成样例数量以保持套件快速。
把漂移当作评审事件
契约测试失败时,比较实现与规范。如果实现正确,更新规范并重新生成客户端;如果规范正确,修复实现。不要未经审查就根据实现自动更新规范,那会把契约变成“服务器当前行为”的描述,包括其中的缺陷。
覆盖生成测试做不到的部分
契约测试不验证业务规则、授权边界或幂等性,这些仍需有针对性的集成测试。每次 PR 运行契约套件,每晚运行更大规模的随机测试。报告中发布失败的请求和响应,使审查者无需重跑整个套件就能复现。