Mock 服务搭建模板
自测题
完成以下 3 道题目,检验你的学习成果
问题 1
一个功能完整的 Mock 服务应该具备哪些核心能力?
解析:Mock 服务核心能力:路由配置(路径、方法、匹配条件)、动态响应(模板变量、延迟模拟)、状态管理(场景切换、调用记录)、契约校验(保证与真实接口一致)。
问题 2
如何保证 Mock 服务与真实接口的一致性?
解析:Mock 服务应基于 OpenAPI/Swagger 规范定义接口契约,启动时校验响应是否符合契约定义(字段类型、必填字段)。定期对比 Mock 响应与真实服务响应,发现不一致时告警。
问题 3
Mock 服务为什么需要状态管理?
解析:Mock 服务的状态管理很重要。比如测试支付流程,需要先设置 Mock 服务返回支付成功,然后验证订单状态更新。场景切换 + 状态持久化 + 调用记录让 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 服务与真实服务偏离过大。
练习建议
- 选简单工具起步:WireMock(Java)、MockServer(Java)、moco(Java)、responses(Python)。选一个熟悉的语言对应的工具。
- 从静态响应开始:先配置 5-10 个接口的固定响应,验证路由匹配和响应返回。
- 逐步增加复杂度:加入模板变量、延迟模拟、场景切换、调用记录。
- 接入真实项目:用一个实际的前端或后端项目接入 Mock 服务,验证联调效率。
面试高频问题
- 「Mock 服务和真实服务不一致怎么办?」→ 契约测试保证一致性,定期对比检测偏差。
- 「Mock 服务怎么管理状态?」→ 场景切换 + 状态持久化 + 调用记录。
- 「Mock 服务在 CI 中怎么用?」→ 容器化部署,CI 启动时拉起 Mock 服务,测试结束后销毁。
- 「Mock 和 Stub 的区别?」→ Stub 是代码级别的简单替换,Mock 是服务级别的完整模拟,支持状态管理和场景切换。
自测题
完成以下 3 道题目,检验你的学习成果
问题 1
一个功能完整的 Mock 服务应该具备哪些核心能力?
解析:Mock 服务核心能力:路由配置(路径、方法、匹配条件)、动态响应(模板变量、延迟模拟)、状态管理(场景切换、调用记录)、契约校验(保证与真实接口一致)。
问题 2
如何保证 Mock 服务与真实接口的一致性?
解析:Mock 服务应基于 OpenAPI/Swagger 规范定义接口契约,启动时校验响应是否符合契约定义(字段类型、必填字段)。定期对比 Mock 响应与真实服务响应,发现不一致时告警。
问题 3
Mock 服务为什么需要状态管理?
解析:Mock 服务的状态管理很重要。比如测试支付流程,需要先设置 Mock 服务返回支付成功,然后验证订单状态更新。场景切换 + 状态持久化 + 调用记录让 Mock 能模拟有状态业务流程。