post · 2026.09.27

怎么证明你的防线真的在防?——故意搞破坏

系统#AI Code Review#研发效能#质量测试#产品设计

规矩写下来不算数,得证明它真的能挡住坏事——最好的办法,是主动去搞破坏。


开场:火灾报警器,得用烟熏一下

你不会因为"报警器说明书上说它会响"就放心。真正的验收办法是:拿个打火机点根烟,对着它熏一下,听到它响,才信它是好的。

这个道理背后,是一个重要的测试哲学:

只测"正常情况能过"是不够的——那只能证明程序"没崩",不能证明防线"真的在防"。要证明防线有效,得主动喂"坏东西"进去,看它会不会挡下来、会不会报警。

这是全系列最硬核、也最值钱的一课:故意搞破坏,才是检验质量的试金石。


二、什么叫"故意搞破坏"——几个例子

放在 AI 审查的产品上,“故意搞破坏"就是主动给系统使坏,看它会不会被抓住。举几个真实的例子:

① 篡改考卷,看它会不会发现 前面说过考卷要"封存 + 打指纹”。怎么验证封存真的有效? → 故意改动考卷里的一个字节,然后让系统加载——如果它必须报警(“考卷被人动过!”),封存才真的有用。如果它毫无反应地照常跑,那就说明"封存"只是做样子的。

② 篡改运行记录,看它会不会发现 产品每次审查都要"记账"(trace)。记账要防的是数据暗中变坏。怎么验证? → 故意把账目改坏:把"总花费"改大一点、把一条记录的时间改到乱序、把结尾一条删掉…… → 系统每一条都必须发现并报警。有一条没发现,说明记账/对账是假的。

③ 篡改答案,看拒收规则认不认得 上一篇说输出要过"合格线"。怎么验证这条线真的守? → 故意造各种"坏答案"喂进去(行号 0、空证据、乱字段……),每一个都必须在合格线被拦下。

这套方法在行业里叫"突变测试 / 故障注入",但概念不重要——你记住一句话即可:

它不是去测"正常能不能跑",而是去测"当我往里面加坏东西时,它能不能察觉"。


三、为什么这是最容易被偷懒、却最不该偷懒的一步

很多团队做测试,只做"happy path"(一切顺利的正常路径):

  • 输入正常数据 → 输出正常 → 测试通过 ✓
  • 然后就宣布"质量有保障了"

但这是一种错觉。它只能证明"程序没崩",完全不能证明"防线在防坏东西"。一个安全系统,它的价值恰恰体现在面对坏东西时的表现。

想想看:

  • 一座"防火城市",光测"正常的日子里一切顺利"有意义吗?它的价值全看火灾来了怎么办。
  • 一套"防篡改考卷",光测"没人动的时候能正常打开"有意义吗?它的价值全看有人动手脚时能不能发现。

所以:设计产品防线时,测试计划里必须专门留一块"破坏测试"——主动使坏,验证防线不是摆设。 这一块被砍掉,基本等于没测过防御。


四、怎么落地成"可执行的检查",而不只是口号

光说"要破坏测试"没用,要落成具体的条条框框。给你一个实操思路:每一个"防御规则",配一个"对应的破坏测试"。

我们的防御规则对应的"故意破坏"测试
考卷做了指纹封存篡改考卷一个字节 → 必须报警
AI 输出要过合格线造一堆"坏答案"→ 必须被拦
运行账目要守恒改坏账目 → 必须被查出
输出格式要规范塞乱字段 → 必须整卷作废

每条规则配一个破坏测试,才算把"防"变成"验"。 这样你来排查时也有底气:我不是"相信它防",我是"测试过它在防"。


五、两个诚实的提醒

  1. 破坏测试不可能穷尽所有坏情况——你不可能试遍所有使坏的方法。它追求的不是"绝对安全",而是"把最重要的防线验证到位"。
  2. 破坏测试要固定下来、长期跑,而不是"上线前突击一次"。因为代码每次改动,都可能偷偷削弱某条防线——持续地破坏测试,才能持续地守住防线。

深入一点(可跳读)

  • 断网测试也属于"故意制造坏环境":把整个测试放到一个没有网的环境里跑,全绿才说明产品真的"自包含、不偷偷依赖外部抓取"。防止"平时能跑是因为偷偷联网,一断网就露馅"。
  • 破坏测试和"单元/集成/回归"的关系:破坏测试不是替代它们,而是专门盯"防御规则"这一层。正常功能测试 + 防御破坏测试,两套并存,缺一不可。
  • 破坏测试的"期望"要写清楚:每一条破坏,都要有明确的"预期报警",而不是笼统的"看看它有没有反应"。

这一篇的收获

证明防线有效的唯一可靠办法,是主动去搞破坏:篡改考卷、改坏账目、喂坏答案、断网——每一项都必须被系统察觉并报警。能查出故障的测试,才是真的有质量的测试;只测"正常能过",等于没测。

下一步,是把这套"验证"用到一个更高频的问题上:产品想加个新功能——比如给 AI 审查加一个"更聪明的代码搜索工具"——你怎么知道它真的让产品变好了? 这正是公平对照实验的用武之地。