测试基础设施(Mock服务)的步骤

一、明确 Mock 服务的目标与范围

1、定义核心目标

  • 明确 Mock 服务要解决的问题:隔离第三方依赖?模拟未开发完成的服务?验证异常场景处理?
  • 例如:“为支付系统测试模拟微信支付 API 的成功 / 失败响应”“为前端开发提供用户服务的 Mock 数据”。

2、梳理需 Mock 的服务清单

  • 列出所有依赖的外部服务(如第三方 API、合作伙伴接口)和内部未就绪服务。
  • 记录关键信息:服务名称、协议(HTTP/gRPC 等)、接口文档、请求 / 响应格式、认证方式。

3、确定适用场景

  • 单元测试 / 集成测试 / 前端开发 / 性能测试?不同场景对 Mock 的实时性、动态性要求不同。
  • 例如:单元测试可能需要代码级 Mock(如 Mockito),而前端开发需要独立运行的 HTTP Mock 服务。

二、选择 Mock 框架与部署方式

1、框架选型(参考前文开源框架)

  • 根据协议(HTTP/gRPC)、技术栈(Java/JS/Python)、功能需求(动态响应 / 录制回放)选择框架。
  • 示例:Java 后端选 WireMock,前端选 MSW,多协议场景选 Hoverfly。

2、部署方式决策

  • 嵌入式:Mock 逻辑嵌入测试代码(如 JUnit+WireMock),适合单元 / 集成测试。
  • 独立服务:单独部署为服务(如 Docker 容器),供多团队共享(适合前端开发、跨团队测试)。
  • 云端 Mock:基于开源框架搭建云服务(如 K8s 部署 Hoverfly),支持弹性扩展。

三、设计 Mock 规则与响应模板

1、制定 Mock 规则规范

  • 统一命名格式:如{服务名}_{接口名}_{场景}(如payment_wechat_success)。
  • 明确规则存储方式:JSON/YAML 文件(便于版本控制)、数据库(适合动态更新)。

2、设计响应模板

  • 静态响应:固定 JSON/XML(适合简单场景,如 “查询用户列表返回固定数据”)。
  • 动态响应:
    • 基于请求参数生成响应(如/users/:id返回对应 ID 的用户信息)。
    • 模拟异常场景(500 错误、超时、数据格式错误)。
    • 注入延迟(模拟网络慢的情况)。
  • 示例(WireMock 配置):

    1. json 运行
    2. {
    3. "request": { "method": "GET", "urlPattern": "/users/(\[0-9\]+)" },
    4. "response": {
    5. "status": 200,
    6. "jsonBody": { "id": "{{request.path.\[1\]}}", "name": "User {{request.path.\[1\]}}" },
    7. "fixedDelayMilliseconds": 300
    8. }
    9. }

3、支持状态化 Mock(可选)

  • 对于有状态的服务(如订单创建→支付→发货流程),需设计状态流转规则(如用数据库记录 Mock 状态)。

四、搭建 Mock 服务与集成测试流程

1、环境搭建

  • 嵌入式:在测试代码中初始化 Mock 框架(如 JUnit 的@Rule public WireMockRule wireMockRule = new WireMockRule(8089);)。
  • 独立服务:
    • 用 Docker 部署:docker run -p 8080:8080 wiremock/wiremock
    • 配置规则目录:挂载本地规则文件到容器,实现动态更新。

2、与测试框架集成

  • 单元测试:在测试用例中启动 Mock 服务→设置规则→执行测试→清理规则。
  • CI/CD 流水线:在 Jenkins/GitHub Actions 中添加 Mock 服务启动步骤,确保自动化测试不依赖外部服务。
  • 示例(CI 脚本片段):

    1. bash 运行
    2. \# 启动Mock服务
    3. docker run -d -p 8080:8080 --name mock-service -v ./mocks:/home/wiremock/mappings wiremock/wiremock
    4. \# 等待服务就绪
    5. sleep 5
    6. \# 执行测试
    7. pytest tests/
    8. \# 停止Mock服务
    9. docker stop mock-service

3、前端开发集成

  • 提供 Mock 服务地址,前端通过配置切换(如开发环境用 Mock,生产环境用真实 API)。
  • 例如:Vue 项目在vue.config.js中配置代理指向 Mock 服务。

五、开发辅助工具与可视化管理

1、规则管理工具

  • 开发 UI 界面(或使用框架自带界面,如 WireMock 的/__admin),支持:
    • 新增 / 编辑 / 删除 Mock 规则
    • 导入 / 导出规则(便于团队共享)
    • 搜索与分类(按服务 / 场景)。

2、请求日志与调试

  • 记录 Mock 服务接收的请求(路径、参数、headers),帮助定位测试问题。
  • 例如:WireMock 的/__admin/requests端点可查看请求历史。

3、监控告警

  • 监控 Mock 服务可用性(如健康检查接口/health)。
  • 对异常请求(如未匹配到规则的请求)触发告警(邮件 / Slack)。

六、运维与迭代优化

1、版本控制

  • 将 Mock 规则文件纳入 Git 管理,与代码同步迭代(如 API 变更时同步更新 Mock 规则)。

2、性能优化

  • 高并发场景下:增加缓存(如缓存常用响应)、水平扩展 Mock 服务(如 K8s 部署多实例)。

3、定期评审与更新

  • 当真实服务更新后,同步更新 Mock 规则(避免 Mock 与真实服务差异过大)。
  • 移除过期规则,清理冗余配置。

4、知识沉淀

  • 编写文档:Mock 服务使用指南、规则设计规范、常见问题排查。
  • 培训团队:讲解 Mock 服务的价值与使用方法,推动测试左移。

七、示例:快速落地一个 HTTP Mock 服务