測試與程式碼品質

為什麼要寫測試程式碼? 即使麻煩也要寫的真正理由

「這些到底要寫到什麼時候……」光是完成一個功能就已經很趕了,還被要求寫測試程式碼,老實說只會先嘆氣。

閱讀 3 分鐘
為什麼要寫測試程式碼? 即使麻煩也要寫的真正理由 封面圖

「這些到底要寫到什麼時候……」光是完成一個功能就已經很趕了,還被要求寫測試程式碼,老實說只會先嘆氣。

先說結論,寫測試程式碼的真正理由是「保護未來的自己」。現在多花10分鐘,是為了避免3個月後在凌晨爆發的服務中斷。

為什麼要寫測試程式碼?

最大的理由是,修改程式碼不再令人害怕。

程式碼不是寫完一次就結束了。你會持續修改並加入功能。

沒有測試時,每修改一行程式碼都會感到不安。「改了這裡,其他地方不會壞掉嗎?」

有測試的話,修改後執行一次就能確認。綠燈代表安心,紅燈則能立刻看出哪裡壞了。

修改後執行一次,不是綠燈就立即確認原因
修改後執行一次,不是綠燈就立即確認原因

這稱為「回歸測試」,也就是找出原本正常、後來又壞掉的部分。


即使麻煩也要寫的真正理由

老實說,測試程式碼一開始會讓人覺得是在吃虧。畢竟它不會增加看得見的功能。

但專案越大,情況就越不同。

功能增加到30個、50個後,不可能靠手動逐一確認。每修改一處,也不可能把所有地方都點一遍。

這時有了測試,只要一行指令,就能在幾秒內驗證數十個案例。

第二個理由是,測試程式碼本身就會成為「文件」。

看過寫得好的測試程式碼,就能一眼看出這個函式對哪些輸入會產生什麼結果。

註解過時後可能會說謊,但測試會被執行,因此無法說謊。

來看個簡單的例子:計算折扣金額的函式測試。

// 11萬元 10% 折扣 → 9應為1千元
@Test func 套用_10折扣_百分比() {
    let result = applyDiscount(10000, rate: 0.1)
    #expect(result == 9000)
}

光看這個測試,就能立刻理解applyDiscount這個函式的用途。

只有親自體驗過終端機出現PASS瞬間的安心感,才會明白
只有親自體驗過終端機出現PASS瞬間的安心感,才會明白

測試程式碼該如何開始?

一開始就想測試所有東西,很快就會筋疲力盡而放棄。

我建議這樣開始。

  1. 先從金額計算、登入等「出問題就不得了」的核心邏輯開始
  2. 條件分支很多、容易搞混的函式
  3. 曾經發生過錯誤的地方(用於防止復發)

相反地,單純的畫面程式碼或經常變動的部分可以之後再做。

目標不是把所有內容都測試到100%,重點是衡量成本與效益。

我先從這三個優先順序開始,逐一加入測試
我先從這三個優先順序開始,逐一加入測試

常見問題

Q. 寫測試會讓開發變慢嗎?

A. 一開始會變慢。但從專案中期開始反而會更快,因為尋找並修正錯誤的時間會大幅縮短。

Q. 測試涵蓋率多少才好?

A. 不必執著於數字。70~80%就足夠,更重要的是重要邏輯是否都有涵蓋。


測試程式碼不是炫耀實力,而是為未來的自己與同事準備的安全裝置。

現在就替今天寫的一個函式加上一個測試吧。感受過那盞小小綠燈帶來的安心後,就會親身明白為什麼大家都叫你寫測試。

延伸閱讀