第二部提過一個原則性的想法:AI 補功能時,可以被要求順便檢查同一個檔案裡有沒有其他測試缺口。今天把這個想法寫成一段具體、可以直接放進專案 CLAUDE.md 或類似設定檔的規則文字,而不是停在「應該要這樣做」的空話。
❌ 只要求加功能
「幫我在 PurchaseRequest 裡加一個 XXX 付款方式的支援,並寫測試。」
AI 通常會照做:加程式碼、幫新功能寫測試。但不會主動去看「這個檔案裡,除了我剛加的這個功能,還有沒有別的路徑測試覆蓋不足」——這不是 AI 偷懶,是沒人要求它做這件事,它沒有理由自己去找。
✅ 同時要求檢查測試缺口
「幫我在 PurchaseRequest 裡加一個 XXX 付款方式的支援,並寫測試。
另外,在你動手之前,先列出這個檔案裡目前還沒有對應測試覆蓋的其他 public 方法或分支,
列給我看,不用一次全部補齊,但要讓我知道有哪些缺口存在。」
差別不在「AI 有沒有能力做到」,在於有沒有人明確要求它做。第二部 commit 80d3469 那個案例,是開發者自己順手發現 ATM/彈性分期缺測試才補上去;如果換成 AI 執行同一個任務,AI 不會有「順手發現」這種直覺,除非任務描述裡明講要它去找。
## 補功能時的測試覆蓋檢查
在幫任何既有類別新增功能或修改邏輯之前,先確認同一個檔案(或同一個高度相關的一組檔案)
目前的測試覆蓋現況:
- 列出這個檔案裡目前「沒有」對應測試的 public 方法、分支或錯誤路徑
- 特別留意 `validate()`、拋出例外的邏輯這類容易被忽略的路徑
- 不需要自作主張把所有缺口都補齊,但要在動手前把清單列給使用者確認,
由使用者決定這次要不要一併處理
這條規則的目的不是要求每次改動都變成一次全面補測試的大工程,
而是避免「新功能配新測試,舊缺口繼續放著」這種模式無限期持續下去。
這段文字刻意沒有要求「每次都要補齊所有缺口」——如果訂得太嚴格,會變成每次小改動都要先花大量時間補歷史債,這條規則反而會被跳過或關掉。規則要能長期被遵守,通常要先承認「不會馬上解決所有問題」,只解決「讓缺口至少被看見、被記錄」這一步。
這段規則文字本身不會憑空生效,需要幾個前提配合:
第三點特別重要——如果沒有地方記錄,這條規則頂多讓開發者在「當下那一刻」意識到缺口存在,但意識到跟真的排進待辦清單是兩回事。
如果你要把類似的規則寫進自己專案的 CLAUDE.md,你會用什麼方式追蹤 AI 列出來、但當下沒空處理的測試缺口清單?一個 TODO 註解、一份獨立的文件,還是別的做法?
明天回到文件漂移的問題:README、CHANGELOG 沒跟上這件事,能不能也用類似的方式讓 AI 幫忙偵測?