測試與程式碼品質

程式碼覆蓋率 100% 的陷阱,多少百分比才適當?

程式碼覆蓋率 100% 並不代表程式碼沒有錯誤。本文整理實務上常見的 70~80% 標準,以及比數字更該優先找出的未驗證分支與判斷方法。

閱讀 3 分鐘
程式碼覆蓋率 100% 的陷阱,多少百分比才適當? 封面圖

撰寫測試程式碼時,不知不覺就會開始執著於覆蓋率數字。

「既然都做了,就應該補到 100%」的心情,我也很能理解。

先說結論,程式碼覆蓋率維持在 70~80% 左右,是實務上最現實的目標;100% 也不代表程式碼沒有錯誤。 接下來會結合我的經驗說明原因。


先看重點摘要

為了方便忙碌的讀者,先整理本文結論。

  1. 覆蓋率 100% 只代表「每一行都執行過」,不代表「所有情況都經過驗證」。
  2. 實務上通常建議維持在 70~80% 左右。
  3. 付款、驗證等重要核心邏輯,可以將目標設定在 90% 以上。
  4. 比起數字,更重要的是知道「哪些內容尚未測試」。

程式碼覆蓋率 100% 就代表沒有錯誤嗎?

這正是最常見的誤解。

覆蓋率 100% 只表示測試「至少執行過程式碼的每一行一次」。

這不代表已驗證每一行是否正確運作。

舉個例子。以下函式就是測試只執行程式碼,卻沒有正確檢查結果的情況。

func divide(_ a: Double, _ b: Double) -> Double {
    return a / b // b如果是 0?測試有執行,但
}

// 這個測試有覆蓋率 100%,但
@Test func divide_只執行_程式碼() {
    _ = divide(10, 2) // 不驗證回傳值(#expect)!
}

這段程式碼達到了 100% 覆蓋率。

但因為沒有透過 #expect確認結果,實際上什麼也無法保證。

覆蓋率衡量的是「執行了多少」,不是「驗證得多完善」。

這就是不能只看數字就放心的原因。


那麼多少百分比才適當?

我將經歷多個團隊後體會到的實際標準整理成表格。(截至 2026 年的一般實務建議值)

程式碼區域 建議覆蓋率 原因
核心商業邏輯 90% 以上 付款、驗證等發生錯誤時後果嚴重
一般服務程式碼 70~80% 成本效益最佳的範圍
UI・檢視層 50~60% 變更頻繁,測試維護成本高
自動產生・設定檔 排除測量 測試意義較低

Google 也曾公開表示,內部將 60% 視為「可接受的水準」、75% 視為「建議值」、90% 視為「典範」。

雖然沒有唯一正解,但可以把接近 80% 視為大多數團隊合理的目標

顯示 78% 數值及綠色、紅色行的程式碼覆蓋率報告畫面
在報告中先確認紅色行,才是真正的重點

為什麼堅持 100% 反而可能吃虧?

補足最後 20% 所需的努力,遠大於補足前 80%。

若要把例外處理、難以到達的分支和防禦性程式碼全部測試,所需時間會呈指數成長。

更大的問題還在後面。

為了填滿數字,會出現「作秀式測試」。

沒有真正驗證內容、只提高覆蓋率的測試,日後修改程式碼時反而會成為阻礙。

每次重構都得花時間修正沒有意義的測試。


常見問題(Q&A)

Q. 那麼,測量覆蓋率本身沒有意義嗎?

不是。覆蓋率非常適合用來找出「測試完全沒有觸及的區域」。

不要把數字當成目標,而是利用覆蓋率報告確認紅色部分(未執行的程式碼)。

Q. 可以在 CI 中強制設定覆蓋率標準嗎?

可以,但建議採用「新程式碼至少 80%」這類方式。

如果對全部程式碼一律設定很高的標準,團隊會因既有程式碼而感到疲憊。

Q. 覆蓋率好像有好幾種類型?

除了行覆蓋率,也建議一起查看分支覆蓋率

因為 if/else 等條件分支是否受到完整測試,更接近實際品質。

終端機中排列顯示綠色 PASS 勾選的單元測試執行畫面
比起數字,我覺得這些綠色勾選更讓人安心

別被數字追著跑,先問問自己:「這個測試真的在守護什麼嗎?」

覆蓋率 80% 但扎實的測試,比覆蓋率 100% 卻空洞的測試可靠得多。祝你今天也能寫出優質的測試程式碼!

延伸閱讀