接口 Mock 和契约测试
目的
定义接口如何 mock、fixture 如何管理、前后端如何并行开发。先保证人能在没有真实外部服务时开发和验证,后续 Agent 也复用同一套 mock 和 sandbox。
基本原则
- Mock 必须来自契约,不要凭空造数据。
- Mock 数据要覆盖正常、空状态、错误、权限不足、边界状态。
- Contract test 必须验证 mock 和真实 API 不漂移。
- 外部服务用 fake server 或 recorded fixture,不直接依赖生产。
- 后续自动化或 Agent run 默认使用 mock 或 sandbox,除非获得真实集成权限。
三角色 Mock 责任
| 角色 | 负责判断 |
|---|---|
| 产品负责人 | mock 数据是否覆盖核心用户状态、空状态、错误状态 |
| 技术负责人 | mock 是否来自契约,contract test 是否能防止漂移 |
| 平台 / 资深工程师 | fake server、fixture、sandbox、smoke 命令是否可复现 |
契约来源
| 接口类型 | 契约来源 |
|---|---|
| REST API | OpenAPI / TypeScript schema / shared protocol |
| Webhook | fixture + signature test |
| Runtime protocol | packages/protocol 或 Go/TS shared schema |
| DB read model | migration + query tests |
| External provider | recorded fixture + smoke witness |
如果仓库已有 packages/protocol 或 shared schema 包,应作为 runtime/API 协议的核心契约来源。
Mock 类型
| 类型 | 用途 | 工具建议 |
|---|---|---|
| UI mock | 前端无后端时开发页面 | MSW、fixture JSON |
| API fake | 后端外部依赖替身 | fake server、Vitest fixture |
| Provider fake | Codex/GitHub 等外部集成替身 | witness fixture、fake daemon |
| DB seed | 本地和测试数据 | seed script、migration fixture |
| Contract fixture | 协议回归 | shared fixture + schema validation |
前后端并行流程
定义 API 契约
-> 生成或手写 fixture
-> 前端用 MSW / mock client 开发
-> 后端实现真实 API
-> contract test 对齐 schema
-> integration test 验证真实 API
Mock 数据集
每个核心页面至少有:
- 正常数据。
- 空状态。
- 加载状态。
- 错误状态。
- 权限不足。
- 大量数据。
- 边界字段缺失。
外部接口 Mock
GitHub
需要覆盖:
- app install;
- issue sync;
- webhook signature;
- branch create;
- PR create;
- write smoke。
如果仓库已有 scripts/github-*smoke* 等脚本,应继续作为真实集成 witness。Witness 和 smoke 的区别:
| 类型 | 依赖真实外部服务 | 验证重点 | 失败说明 |
|---|---|---|---|
| Contract fixture | 否 | 本地 schema、fixture、parser 是否兼容 | 代码和契约不一致 |
| Witness test | 通常否,或只使用录制/沙箱数据 | webhook 签名、payload normalization、权限映射、错误分类 | 集成协议处理有问题 |
| Smoke test | 是,使用低风险真实账号或 sandbox | 凭证、网络、provider API、adapter、状态回传是否端到端可用 | 真实集成路径失效 |
后续 Provider / Agent
需要覆盖:
- fake provider;
- fake runtime daemon;
- real provider smoke;
- event normalization fixture;
- failure fixture。
参考命令包括 runtime:fake、runtime:test、smoke:codex,实际项目应替换为自己的 provider fake、runtime test 和 smoke。
| 命令语义 | 目的 | 示例命令 |
|---|---|---|
| Fake provider | 本地模拟 provider 响应,覆盖成功、失败、超时、权限不足 | pnpm runtime:fake、fake server、recorded fixture |
| Runtime protocol test | 验证 runtime daemon 的 claim、heartbeat、日志回传、artifact 上报 | pnpm runtime:test、go test ./... |
| Real provider smoke | 用真实或 sandbox provider 跑低风险闭环 | pnpm smoke:codex、项目 provider smoke |
| Failure fixture | 固定错误样本,验证 error classification 和 retry 策略 | fixture-based test |
后续 Agent 就绪要求
Agent 执行时应优先使用:
- Mock API。
- Fake daemon。
- Sandbox provider。
- Recorded fixture。
- Contract test。
只有在 scope、secret grant、approval 都满足时,才允许真实外部服务调用。
反模式
- 前端直接等待后端完成才开始。
- Mock 数据和真实 schema 无关。
- 只 mock 成功路径。
- 测试依赖生产第三方服务。
- Agent 默认拿真实 token 调外部 API。
下一步阅读
读完或填完这份文档后,通常继续看:
- 33-测试和质量-testing-quality.md:Mock 和契约准备好后,继续确认测试门禁。