Engineering · 1 min read
被污染的測試基準會反轉你的診斷
當你信任的測試基準有缺陷時,它回傳的每個結果都是支持錯誤結論的證據。嚴謹用在壞 oracle 上只會更有信心地確認錯誤。
一個 GIF 影格數測試紅了,三層驗證都指向「libvips 8.18 回歸了」(regression:之前正常、更新後壞掉),直到我換了一張不同影格的測試圖——同一版 libvips,瞬間全綠。問題從來不在程式碼,而在餵進去的那張圖。
當你信任用來判定結果的測試本身有缺陷時,它回傳的每一個結果都是支持錯誤結論的證據。更仔細地重跑,只會用更高的信心確認錯誤。
| fixture(測試輸入) | verdict | 你接下來的結論 |
|---|---|---|
| 相同影格(synthetic) | 紅 | 「libvips 8.18 回歸了」→ 釘版 3.20、graft、EOL base |
| 不同影格(生產形態) | 綠 | 「8.18 沒問題」→ 出貨 3.22、修 fixture |
兩次跑的是同一版 libvips 8.18.4——只有輸入變了。
Oracle 從未故障;它回答了一個沒人想問的問題。這就是為什麼更多的嚴謹反而讓事情更糟:嚴謹會放大 oracle 正在測量的東西,而這裡它測量的是 fixture。
- 徵兆: 一個紅測試驅動了一個巨大的結構性結論(「上游 lib 壞了」),但測試的輸入是 synthetic 的,從未接近過生產。
- 嚴謹用在壞 oracle 上會發散。 三列版本表格看起來很徹底,但如果所有列共用一個有缺陷的輸入,它們都以同樣的方式說謊。
- 攻擊輸入,不要重跑。 餵一個生產形態的輸入,看 verdict 是否翻轉。
- 矛盾信號通常存在但被埋沒。 這裡是一行 log 證明影格被寫入了(見 GIF 編碼器合併相同影格是合法行為)。去找那個「如果你的診斷是對的就不該存在」的事實。
oracle 回答的問題,和你以為你問的問題,不一定是同一個。
Related: 回到連鎖反應總覽,或參見逐層下降隔離回歸問題、GIF 編碼器合併相同影格是合法行為、測試結果只是關於輸入的事實。