故障路径是什么
故障路径用例针对「依赖出错、数据异常时系统怎么办」:上游超时、连接被拒、返回 5xx、响应变慢、部分成功、脏数据。每个外部依赖调用点都是故障注入点;用例要同时断言两个面——用户可感知行为(提示、降级内容)与系统状态(重试、熔断、数据一致性)。
基本信息
| 注入点 | 数据库、缓存、消息队列、第三方接口、文件系统 |
|---|---|
| 故障类型 | 超时、连接拒绝、5xx、慢响应、连接中断、畸形数据 |
| 系统应有表现 | 重试上限、熔断降级、友好提示、不丢数据 |
| 工具 | 测试替身(mock/stub)、代理中断、故障注入平台 |
| 断言双面 | 界面表现加后端状态:订单状态、流水、队列 |
| 组合场景 | 并发时故障:一个依赖慢导致线程池耗尽的连锁反应 |
注入示例
注入示例
from unittest.mock import patch
with patch("svc.pay.charge", side_effect=TimeoutError): # 模拟支付超时
resp = submit_order(order)
assert resp.code == "PAY_TIMEOUT" # 有明确错误码
assert order.status == "待支付" # 状态可重试,不丢单
典型使用场景
- 支付、下单关键链路:依赖不稳是常态,容错必须可验证
- 第三方对接:对方超时与限流下的自身表现
- 重试与幂等:模拟重复回调与重复提交
- 熔断降级验证:依赖连续失败后是否进入短路状态
- 数据修复:脏数据与缺失数据导入后的系统行为
故障类型与期望行为
| 故障 | 期望行为 | 核对点 |
|---|---|---|
| 超时 | 重试有限次后明确失败 | 不无限挂起,状态可恢复 |
| 连接拒绝 | 快速失败加告警 | 不长时间阻塞线程 |
| 5xx | 熔断或降级 | 降级内容对用户可见 |
| 慢响应 | 超时保护生效 | 不拖垮线程池 |
| 畸形数据 | 校验拦截 | 不落库,不污染存量 |
故障用例必须含「恢复后」的验证:熔断要能自动恢复、重试成功后的数据要最终一致,只看失败瞬间是不够的。
生产环境注入故障走混沌工程流程:控制爆炸半径、有随时终止的手段、通知相关方,别拿线上当试验田。
替身故障要和真实故障形状一致:真实故障往往是连接中断或超时,不是抛一个干净的异常,替身太理想会漏掉处理缺陷。