
很多接口测试和服务端测试失败,不是被测系统坏了,而是下游不稳定。
支付沙箱挂了、会员服务没数据、营销接口限流、风控规则不可控、第三方回调延迟、库存环境被别人改了。QA 表面上在测当前需求,实际上一半时间花在等下游、问数据、重试环境。
这种场景不适合继续靠人肉协调,应该引入服务虚拟化:用可控的 Mock/Stub 替代不稳定下游,把测试变量收回来。
如果再加一层 Agent,它的价值不是“自动 mock 一切”,而是帮助 QA 判断哪些下游该真实调用、哪些该虚拟化、每个虚拟响应应该覆盖哪些边界。

服务虚拟化对接口测试、服务端测试、功能联调、APP/小程序测试都有价值。
接口测试:
服务端测试:
功能测试:
APP/小程序测试:
没有服务虚拟化时,QA 常见做法是:
这会带来两个问题。
第一,测试不可重复。
同一个用例今天能过,明天因为下游数据变化就失败。
第二,异常场景测不全。
比如支付超时、营销限流、风控拒绝、第三方返回脏字段,这些场景真实环境不一定容易触发。
服务虚拟化 Agent 不应该直接替 QA 改路由。
它应该先接管 4 个动作。
第一,识别下游依赖。
根据接口文档、调用链、日志、trace,整理当前接口依赖哪些下游:
被测接口:
真实下游:
可虚拟化下游:
必须真实调用:
高风险依赖:
第二,生成 stub 场景。
不是只生成一个成功响应,而是按测试目标拆:
正常响应:
业务失败:
字段缺失:
响应超时:
返回 5xx:
重复请求:
脏数据:
第三,输出验证点。
每个 stub 都要对应断言:
第四,标记不能虚拟化的部分。
比如真实支付、真实库存扣减、合规风控、真实通知,不应该随便用 mock 替代最终验收。
假设测试“提交订单时调用营销试算”。
真实下游营销服务经常不稳定。
服务虚拟化 Agent 可以生成一组场景:
场景 1:营销返回可用优惠
预期:订单金额扣减,页面展示优惠明细
场景 2:营销返回无可用优惠
预期:订单原价提交,页面不展示优惠
场景 3:营销接口超时
预期:触发降级,订单仍可提交或按业务规则阻断
场景 4:营销返回字段缺失
预期:接口不应 NPE,错误被记录
场景 5:重复提交同一订单
预期:不重复扣减优惠额度
这比“等营销环境好了再测”更可控。

服务虚拟化不是为了逃避真实联调。
它解决的是“早期可控验证”和“异常场景覆盖”。
我建议分三层。
第一层,单服务验证。
下游可以虚拟化,重点验证当前服务逻辑。
第二层,集成验证。
核心下游要真实调用,非核心下游可以虚拟化。
第三层,发布前验收。
主链路必须至少跑一次真实链路,确认配置、鉴权、数据和网络都没有问题。
如果全程只用 mock,很容易出现“测试环境通过,真实联调失败”。
不要一开始搭完整平台。
选一个最不稳定、但又经常影响测试的下游。
准备:
用 WireMock 这类工具先搭一个本地 stub,覆盖 3 个场景:成功、业务失败、超时。
然后让 Agent 输出:
stub 场景:
对应请求匹配规则:
返回体:
当前服务预期行为:
需要人工确认:
能跑通这一步,再考虑接更多下游。
第一,不要让 Agent 直接改共享环境路由。
它只生成 stub 设计和配置草稿。
第二,每个 stub 必须有元数据。
适用需求:
覆盖场景:
数据来源:
风险说明:
失效条件:
第三,保留真实链路验证。
服务虚拟化只能提高验证稳定性,不能替代最终真实集成。
第四,异常场景要比成功场景更重要。
如果只 mock 成功响应,价值很有限。
服务虚拟化最容易出现 3 个坑。
第一,stub 过期。
下游字段已经改了,但 stub 还在返回旧结构。
第二,mock 掩盖真实问题。
真实环境鉴权、网络、限流、超时策略可能和 stub 不一样。
第三,异常场景设计不完整。
只测 500,不测超时、慢响应、字段缺失、重复回调,仍然会漏问题。
所以服务虚拟化 Agent 必须输出“真实链路补测项”。

服务虚拟化不是让 QA 偷懒,而是让测试从“等环境”变成“控变量”。
它适合解决:
Agent 的价值在于识别依赖、设计 stub、补异常场景、标记真实链路补测项。
但最终发布前,核心真实链路仍然必须验证。