规矩写下来不算数,得证明它真的能挡住坏事——最好的办法,是主动去搞破坏。
开场:火灾报警器,得用烟熏一下
你不会因为"报警器说明书上说它会响"就放心。真正的验收办法是:拿个打火机点根烟,对着它熏一下,听到它响,才信它是好的。
这个道理背后,是一个重要的测试哲学:
只测"正常情况能过"是不够的——那只能证明程序"没崩",不能证明防线"真的在防"。要证明防线有效,得主动喂"坏东西"进去,看它会不会挡下来、会不会报警。
这是全系列最硬核、也最值钱的一课:故意搞破坏,才是检验质量的试金石。
二、什么叫"故意搞破坏"——几个例子
放在 AI 审查的产品上,“故意搞破坏"就是主动给系统使坏,看它会不会被抓住。举几个真实的例子:
① 篡改考卷,看它会不会发现 前面说过考卷要"封存 + 打指纹”。怎么验证封存真的有效? → 故意改动考卷里的一个字节,然后让系统加载——如果它必须报警(“考卷被人动过!”),封存才真的有用。如果它毫无反应地照常跑,那就说明"封存"只是做样子的。
② 篡改运行记录,看它会不会发现 产品每次审查都要"记账"(trace)。记账要防的是数据暗中变坏。怎么验证? → 故意把账目改坏:把"总花费"改大一点、把一条记录的时间改到乱序、把结尾一条删掉…… → 系统每一条都必须发现并报警。有一条没发现,说明记账/对账是假的。
③ 篡改答案,看拒收规则认不认得 上一篇说输出要过"合格线"。怎么验证这条线真的守? → 故意造各种"坏答案"喂进去(行号 0、空证据、乱字段……),每一个都必须在合格线被拦下。
这套方法在行业里叫"突变测试 / 故障注入",但概念不重要——你记住一句话即可:
它不是去测"正常能不能跑",而是去测"当我往里面加坏东西时,它能不能察觉"。
三、为什么这是最容易被偷懒、却最不该偷懒的一步
很多团队做测试,只做"happy path"(一切顺利的正常路径):
- 输入正常数据 → 输出正常 → 测试通过 ✓
- 然后就宣布"质量有保障了"
但这是一种错觉。它只能证明"程序没崩",完全不能证明"防线在防坏东西"。一个安全系统,它的价值恰恰体现在面对坏东西时的表现。
想想看:
- 一座"防火城市",光测"正常的日子里一切顺利"有意义吗?它的价值全看火灾来了怎么办。
- 一套"防篡改考卷",光测"没人动的时候能正常打开"有意义吗?它的价值全看有人动手脚时能不能发现。
所以:设计产品防线时,测试计划里必须专门留一块"破坏测试"——主动使坏,验证防线不是摆设。 这一块被砍掉,基本等于没测过防御。
四、怎么落地成"可执行的检查",而不只是口号
光说"要破坏测试"没用,要落成具体的条条框框。给你一个实操思路:每一个"防御规则",配一个"对应的破坏测试"。
| 我们的防御规则 | 对应的"故意破坏"测试 |
|---|---|
| 考卷做了指纹封存 | 篡改考卷一个字节 → 必须报警 |
| AI 输出要过合格线 | 造一堆"坏答案"→ 必须被拦 |
| 运行账目要守恒 | 改坏账目 → 必须被查出 |
| 输出格式要规范 | 塞乱字段 → 必须整卷作废 |
每条规则配一个破坏测试,才算把"防"变成"验"。 这样你来排查时也有底气:我不是"相信它防",我是"测试过它在防"。
五、两个诚实的提醒
- 破坏测试不可能穷尽所有坏情况——你不可能试遍所有使坏的方法。它追求的不是"绝对安全",而是"把最重要的防线验证到位"。
- 破坏测试要固定下来、长期跑,而不是"上线前突击一次"。因为代码每次改动,都可能偷偷削弱某条防线——持续地破坏测试,才能持续地守住防线。
深入一点(可跳读)
- 断网测试也属于"故意制造坏环境":把整个测试放到一个没有网的环境里跑,全绿才说明产品真的"自包含、不偷偷依赖外部抓取"。防止"平时能跑是因为偷偷联网,一断网就露馅"。
- 破坏测试和"单元/集成/回归"的关系:破坏测试不是替代它们,而是专门盯"防御规则"这一层。正常功能测试 + 防御破坏测试,两套并存,缺一不可。
- 破坏测试的"期望"要写清楚:每一条破坏,都要有明确的"预期报警",而不是笼统的"看看它有没有反应"。
这一篇的收获
证明防线有效的唯一可靠办法,是主动去搞破坏:篡改考卷、改坏账目、喂坏答案、断网——每一项都必须被系统察觉并报警。能查出故障的测试,才是真的有质量的测试;只测"正常能过",等于没测。
下一步,是把这套"验证"用到一个更高频的问题上:产品想加个新功能——比如给 AI 审查加一个"更聪明的代码搜索工具"——你怎么知道它真的让产品变好了? 这正是公平对照实验的用武之地。