混沌工程和普通测试有什么区别?
更新时间:2026-09-19。短答页。两者都在「找问题」,但问题类型和方法论完全不同。
一句话回答
普通测试验证「系统在预期输入下功能对不对、能扛多少负载」;混沌工程主动制造「意外故障」,验证系统在依赖挂掉、网络异常、资源耗尽时是否还能按假设自愈。 前者回答「我写得对不对」,后者回答「我以为它扛得住,真的扛得住吗」。
对比
| 维度 | 单元/集成/压测 | 混沌工程 |
|---|---|---|
| 输入 | 已知用例、正常/边界数据、确定的压测流量 | 随机杀实例、延迟/丢包/分区、CPU/磁盘打满 |
| 想证明 | 功能正确、容量足够 | 韧性假设成立(故障转移、熔断、降级、告警有效) |
| 结果预期 | 确定的 pass/fail | 先立「稳态不被破坏」假设,实验可能推翻它 |
| 典型环境 | 测试/CI | 最终要到生产真实流量下验证 |
| 发现的问题 | 代码 bug、性能瓶颈 | 超时缺失、重试风暴、级联雪崩、脑裂、告警没响 |
混沌的方法论
- 先定义稳态:用成功率、P99 等 SLO 指标描述「正常」是什么样。
- 提出假设:「杀掉一个实例,因为有负载均衡和 N+1,成功率应基本不变」。
- 注入故障:杀 Pod、网络延迟、依赖报错等。
- 对照观察、控制爆炸半径:从单实例、小流量、低峰开始,能一键中止。
- 假设被推翻就是收获:说明兜底没生效,低成本发现并修复,避免凌晨真爆。
它和压测也不同:压测把流量加到极限找容量拐点,混沌在「正常甚至小流量」下破坏基础设施找韧性缺口。两者常配合——大促前既压容量也做故障演练。
坑
- 把混沌当「随便搞破坏」,不设稳态指标和中止条件,无法判断影响。
- 一上来就在生产核心链路大范围注入,演练变事故。
- 以为有了单元测试就有韧性——测试通过不代表断网/宕机时系统能自愈。
完整原则见 混沌工程:稳态假设与爆炸半径,工具见 Chaos Mesh/Litmus。
总结
传统测试用确定性输入验证功能与容量,混沌工程则用随机的真实故障注入去检验系统面对意外时的韧性假设:先以 SLO 定义稳态、假设故障下稳态可保持,再在严格控制爆炸半径、可随时回滚的前提下从测试环境逐步推进到生产,重点发现超时、重试风暴、级联故障、脑裂和告警缺失这类组件交互问题,实验推翻假设即是最有价值的结果。