拆一支 3000 行巨檔,最後救我的不是測試
我有一支跑了一個月的報告產生器,長到 3000 行。該拆了。
我把它拆成渲染層、推播層、薄入口,跑了完整驗證:80 個單元測試全過、渲染快照逐位元組零變化。看起來漂漂亮亮,可以上線了。
然後我多做了一步
部署前,我堅持多測一件事——用「腳本模式」(python xxx.py,也就是雲端 cron 實際跑它的方式)實跑一次。
碰一聲,ImportError: cannot import name ... from partially initialized module。循環匯入,直接崩。
為什麼測試抓不到
關鍵在這裡:我的單元測試和快照,都是用「模組匯入」(import xxx)的方式載入這支檔。而那個循環匯入的 bug,只在它同時當 __main__ 入口執行時才會發生。
- 以模組匯入 → 一切正常 → 測試全綠 ✅
- 以腳本執行 → 重複載入、循環、崩潰 ❌
而雲端的每日排程,正是用腳本模式在跑它。我差一點就帶著滿江綠的測試,盲目上線,讓當晚的排程整個炸掉。
兩個帶走的教訓
- 測試綠 ≠ 安全。 測試只覆蓋你「想到要測的路徑」。生產環境怎麼跑它,你就得照那個方式至少實跑一次。
- 放手交給工具,但最後那一關自己留著。 不是不信任自動化,是因為有些坑,要多走一步、多換一個角度,才看得到。
修法很簡單:加一支薄入口 wrapper 繞過循環,再把雲端實跑一遍、線上健檢,全綠。那支巨檔,3000 行瘦成 2000 行。
AI 跑得快,但「會不會炸」這種事,急不得。