iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

文章同步於blog

前言

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

介紹

單元測試(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)


上一篇
【Day-11】其他軟體開發原則(簡介)
下一篇
【Day-13】伺服器端渲染(SSR)
系列文
軟體開發 - 程式不是會跑就好30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Hell Kiki
iT邦新手 4 級 ‧ 2023-09-12 08:25:31

很多人會說,我沒有時間寫單元測試,可以回嗆他:你就是不寫測試才會沒有時間 XDDDD
還有個好處是可以減少改A壞B的情況,大家都會覺得自己只改個小地方很有自信,但莫非定律告訴我們總是會爆

我認為改A壞B比較跟單元測試沒有關係
這跟設計面或許會更有關聯

如果設計模式是互相依賴的高耦合結構,例如10個完全不同的function依賴同一個底層function,那就很容易有問題

另外,沒寫單元測試我們找到一個比較有吸引力的說詞
CICD對於大部分的人來說是一個很酷炫的東東
幾個步驟就可以部屬上去

但沒有單元測試的CI就跟沒有醬汁炸鳳尾蝦一樣
沒有跑的必要XD

所以我說那個單元測試呢

我要留言

立即登入留言