SuperAPI AI 工具集

service-virtualization

测试与质量

查看项目

更新于 10-15 14:31

技能介绍

用途

本技能是一套用于在测试套件中隔离每一个外部依赖的决策框架。它回答的核心问题是:面对外部 HTTP API、数据库、缓存、消息队列等依赖,应该选择哪种虚拟化策略,以及如何把这些策略接入 CI。

主要能力

技能提供快速路由表,按场景指向对应参考文件:Node/浏览器测试调用外部 HTTP API 用 MSW;多语言 CI、复杂匹配或需要独立桩服务器用 WireMock;依赖是数据库/缓存/队列用 Testcontainers;测试超时、延迟、连接重置用 Toxiproxy;从真实 API 引导桩或多步基线用录制回放;接入 GitHub Actions 见 CI 参考;不确定时使用决策树。

技能还给出发现性问题清单,用于先确认外部依赖数量、哪些在测试中痛苦(限流、慢、不稳定、付费的优先虚拟化)、各测试层级需要什么隔离、提供方是否有官方测试模式或沙箱、是否已有契约、CI 是否有 Docker。

核心原则

  1. 隔离级别要匹配所需信心:单元测试可激进 Mock,集成测试应使用真实桩或真实服务,E2E 应运行最接近生产且仍可靠的环境。
  2. 当真实服务快速、免费、可靠时优于假实现,例如本地 PostgreSQL 容器;假实现留给慢、不可靠或付费的依赖。
  3. 不要在没有契约的情况下 Mock 你不拥有的东西,并优先使用提供方测试模式;顺序为:官方测试模式/沙箱 → 经契约测试验证的 HTTP 桩 → 裸桩。
  4. 桩必须能真实地失败,每个桩都需要错误变体:429 限流、500、超时、畸形响应体。
  5. 在测试与工具之间保留一个抽象层,统一包装 MSW、WireMock、Testcontainers,便于切换工具。

决策框架

技能提供策略对比表(速度、保真度、复杂度、最佳用途)和决策树:依赖是否在代码库内部 → 是则进程内 Mock;否则是否为数据库/缓存/消息队列 → 是则 Testcontainers;否则是否为第三方 HTTP API → 是则看提供方是否有测试/沙箱模式,有则在 staging 用沙箱、CI 用 MSW/WireMock,无则 MSW 或 WireMock 加契约测试检测漂移;否则是否为内部微服务 → 是则契约测试加桩;否则逐案评估。

工具

  • MSW:默认用于进程内 Node/浏览器测试,2.x 在网络层拦截 HTTP,应在 HTTP 层打桩而非 SDK 方法;用 setupServer(...).listen({ onUnhandledRequest }) 在 CI 设为 "error" 强制失败。
  • WireMock:语言无关的 HTTP 桩服务器,当前稳定版 3.13.2(4.0 截至 2026 年中仅 beta),适合多语言环境或复杂匹配;用优先级映射处理错误场景,并提供 admin API。
  • 其他 HTTP Mock 服务器:Mockoon(桌面 UI + CLI、OpenAPI 导入)、Hoverfly(捕获回放)、Prism(OpenAPI 驱动)、MockServer(Java)。
  • Testcontainers:在 Docker 中启动真实服务,端口随机,必须用 getMappedPort()/getConnectionUri() 读取,不可硬编码。
  • Toxiproxy:作为 TCP 代理注入延迟、带宽限制和连接重置,afterEach 中必须移除 toxics。
  • 录制回放:用 Hoverfly、Polly.JS 或 VCR 式 cassette 实现,对动态数据、有状态序列和老化敏感,应打 recordedAt 并在超过 30 天时失败。

使用方式

技能按参考文件组织:references/msw.md、wiremock.md、testcontainers.md、toxiproxy.md、record-replay.md、ci.md,分别给出具体配置、代码和接线方式。CI 集成方面,MSW 无需基础设施,只需在 CI 设 onUnhandledRequest: error;WireMock 和 Testcontainers 需要 Docker。注意 docker-compose 固定端口模型与 Testcontainers 随机端口模型不可在同一套件混用。

适用场景

适用于需要为测试套件设计外部依赖隔离策略的团队,尤其是涉及支付、邮件、认证、第三方数据源等限流、慢、不稳定或付费依赖的项目,以及需要把桩接入 CI 并验证无真实调用泄漏的场景。

限制

技能本身是决策框架与参考集合,不提供具体项目的完整实现;部分工具版本信息(如 WireMock 4.0 状态、Elasticsearch 镜像标签)具有时效性;录制回放会因动态数据和老化而失效;未提供官方测试模式的提供方只能依赖契约测试降低漂移风险。