0%

【Day-12】單元測試

文章同步於it邦

前言

今天要來講一個在開發階段很重要的概念 - 單元測試

前面我們講了不少軟體開發的原則
那有沒有想過,我們在寫完這些程式之後,要怎麼確保他能夠正常使用

而這中間有一個很重要的一環就是單元測試

介紹

單元測試(Unit Testing),是軟體開發中的一個重要概念
它是軟體測試的一個階段,用於確保程式中的個別「單元」(通常是函數、方法、類別等)能夠按照預期的方式正確運作

單元測試的主要目標是在開發過程中迅速發現和修復程式碼中的錯誤,以確保軟體的品質和穩定性。

舉個例子
假設我今天在撰寫一隻Controller是用於取得學生的成績
那這個Controller中間有一個use case是要計算需要顯示的資料量

那我們就會針對這個最小的單元(顯示的資料量的function)去撰寫單元測試

為什麼要撰寫單元測試

寫單元測試有幾個好處

  1. 確保 debug 的時間不會太長,因為撰寫過單元測試,我可以知道說這個function在大部分情況下有沒有如預期般輸出開發者需要的資訊,也就是及早發現錯誤確保功能正確性
  2. 讓閱讀code的人了解這個function應該要做什麼,輸入和輸出什麼樣的資訊
  3. 在重構的時候,可以去了解說我是否有正確重構這個function
  4. 在 CI 階段,確保沒有問題才會放上生產環境

注意事項

有一點需要特別注意就是,不該去依賴使用中的資料庫的資料來做單元測試
有可能會因為資料庫中的資料有所改動而導致不必要的錯誤

因此我們可以使用模擬(Mocking)或偽造(Stubbing)的方式來建立不影響現有環境且獨立的假資料來進行單元測試

F.I.R.S.T

根據 Clean Code這本書的描述,整潔的測試應該遵循這五個字母的法則

  • Fast(快速): 測試應該要執行快速。
  • Independent(獨立): 測試程式不可互相依賴。每個階段都是獨立的程式。
  • Repeatable(可重複性): 可以在任何環境重複執行。我想這非常重要,通常我們的開發環境會和Server的環境不同,所以一定要有辦法在各種環境下重複執行。
  • Self-Validating(自我驗證): 測試程式應該輸出 boolean
  • Timely(及時): 及時撰寫單元測試。單元測試要在產品程式之前就寫好。

關於習慣這件事

上面都看不懂沒關係,這個才是最重要的
很多人會說,我沒有時間寫單元測試

但我必須說,這是習慣養成的問題,第一次寫一定比較慢
不過一回生二回熟,寫久了就知道每個框架要怎麼撰寫單元測試
上面說過,寫單元測試有兩個好處就是,及早發現錯誤確保功能正確性
當api出錯的時候,你總不會想要一個一個慢慢通靈出哪個地方有問題

撰寫單元測試後,可以直接發現哪邊有問題
這邊有一個要點就是,必須盡可能的考慮到所有狀況
當然不可能想到全部的可能性
不過在盡可能的嘗試之後,至少出錯的機率也會大幅將低許多

結語

我只能說,測試真的是一個可以講很多東西的一個章節
我連TDD都沒有說明
要講下去鐵人賽可能要60天了XD

明天要講一下架構面的部分,先從伺服器端渲染(SSR)開始

參考資料

Clean Code(ch.9)