Skip to content

Mock 服务搭建模板

自测题

完成以下 3 道题目,检验你的学习成果

问题 1

一个功能完整的 Mock 服务应该具备哪些核心能力?

问题 2

如何保证 Mock 服务与真实接口的一致性?

问题 3

Mock 服务为什么需要状态管理?

模板使用说明

Mock 服务是测试开发和前后端协作的重要基础设施。通过 Mock 服务,可以在真实依赖不可用时保证测试和开发的独立性。这个模板帮你练习从零搭建一个功能完整的 Mock 服务,涵盖路由配置、动态响应、状态管理、契约校验等核心能力。

项目骨架

第一步:路由配置与请求匹配

目标:定义 Mock 服务的路由规则和请求匹配逻辑。

关键产出

  • 路由定义:为每个接口定义路由规则,包括路径、方法、匹配条件。例如 GET /api/users/{id} 匹配获取用户信息的请求。
  • 匹配规则:支持多种匹配方式。精确匹配(URL + Method 完全一致)、条件匹配(请求参数或 Body 中某字段等于特定值)、正则匹配(URL 模式匹配)。
  • 优先级管理:多条规则可能同时匹配,需要定义优先级。精确匹配优先级最高,正则匹配最低。同优先级按定义顺序匹配。

配置示例(YAML 格式):

routes:
- path: /api/users/{id}
method: GET
match:
type: exact
response:
status: 200
body: '{"id": "{{path.id}}", "name": "测试用户", "email": "test@example.com"}'
delay: 0

第二步:响应模板与动态生成

目标:让 Mock 服务能根据请求动态生成响应,而非返回固定值。

关键产出

  • 模板变量:响应体中使用模板变量引用请求信息。如 {{path.id}} 引用路径参数、{{query.page}} 引用查询参数、{{body.name}} 引用请求体字段。
  • 动态逻辑:支持简单的条件逻辑。如根据请求参数返回不同响应:{{#if query.include_details}}...{{/if}}
  • 延迟模拟:支持配置响应延迟,模拟慢响应场景。固定延迟(如 500ms)、随机延迟(100-1000ms)、渐进延迟(模拟服务降级)。
  • 异常响应:配置特定触发条件返回异常响应。如请求头中包含 X-Mock-Error: true 时返回 500 错误。

第三步:状态管理与场景切换

目标:Mock 服务能维护状态,支持不同测试场景的切换。

关键产出

  • 场景定义:定义不同的 Mock 场景。如 normal(正常响应)、slow(慢响应)、error(错误响应)、partial(部分数据缺失)。
  • 场景切换:通过 API 或配置文件切换当前场景。如 POST /__mock__/scenario 设置场景为 error
  • 状态持久化:Mock 服务维护运行时状态。如记录某用户是否已下单、某商品库存是否充足。后续请求根据状态返回不同响应。
  • 调用记录:记录每次请求的详细信息,用于验证业务逻辑是否正确调用了依赖。提供查询接口:GET /__mock__/calls 查看调用历史。

面试表达要点:「Mock 服务的状态管理很重要。比如测试支付流程,需要先设置 Mock 服务返回支付成功,然后验证订单状态更新。状态管理让 Mock 服务能模拟有状态的业务流程。」

第四步:契约校验与文档同步

目标:保证 Mock 响应与真实接口契约一致。

关键产出

  • 契约定义:基于 OpenAPI/Swagger 规范定义接口契约。包括路径、方法、请求参数、响应体 schema。
  • 契约校验:Mock 服务启动时校验响应是否符合契约定义。字段类型不匹配、缺少必填字段、多余字段等情况发出警告。
  • 文档同步:Mock 服务根据契约自动生成接口文档。契约变更时文档自动更新,保证 Mock 响应和文档一致。
  • 变更检测:定期对比 Mock 响应与真实服务的响应,发现不一致时告警。避免 Mock 服务与真实服务偏离过大。

练习建议

  1. 选简单工具起步:WireMock(Java)、MockServer(Java)、moco(Java)、responses(Python)。选一个熟悉的语言对应的工具。
  2. 从静态响应开始:先配置 5-10 个接口的固定响应,验证路由匹配和响应返回。
  3. 逐步增加复杂度:加入模板变量、延迟模拟、场景切换、调用记录。
  4. 接入真实项目:用一个实际的前端或后端项目接入 Mock 服务,验证联调效率。

面试高频问题

  • 「Mock 服务和真实服务不一致怎么办?」→ 契约测试保证一致性,定期对比检测偏差。
  • 「Mock 服务怎么管理状态?」→ 场景切换 + 状态持久化 + 调用记录。
  • 「Mock 服务在 CI 中怎么用?」→ 容器化部署,CI 启动时拉起 Mock 服务,测试结束后销毁。
  • 「Mock 和 Stub 的区别?」→ Stub 是代码级别的简单替换,Mock 是服务级别的完整模拟,支持状态管理和场景切换。

自测题

完成以下 3 道题目,检验你的学习成果

问题 1

一个功能完整的 Mock 服务应该具备哪些核心能力?

问题 2

如何保证 Mock 服务与真实接口的一致性?

问题 3

Mock 服务为什么需要状态管理?