此篇文章主要帶大家了解為什麼程式需要單元測試,有興趣就往下看吧!
工程師完成需求,盡可能要維持開放封閉原則(OCP)情況下來修改程式,這跟寫不寫單元測試並無衝突,但如果你有寫的話,兩者就會相輔相成。
⭐ 其實單元測試你可以把它想像成走路線小遊戲...
當今天有一個要求(Request)打了某一個 Web API,根據需求所撰寫的程式,是否有辦法走完每一條路線(使用案例)呢?
下圖所示為程式碼涵蓋率 100% 的情況(代表每一路線均有走完):
而當今天因為新需求,而有了新路線時,如下圖:
❗ D 路線因需求變化而產生,因為 D 修改的程式對於 A、B、C 來說是不穩定的因素,需要特別留意…
寫完單元測試後才漸漸明白它可以幫我們快速做回歸測試(Regression Testing),D 測試寫出來,直接一併測 A、B、C、D,就能知道 D 的修改是否會影響 A、B、C 哦!
時常看到有人會把單元測試理解為整合測試,但兩者並不一樣,別再搞混了!!!!
舉幾個例子,如果有人問你以下問題:
大概就可以知道他對單元測試的了解程度,我來看的話,就是直接出局!!
單元測試關注的是測試程式本身邏輯,所以必須要把外部依賴(Database、File System IO)全部排除掉才有辦法往下進行!
一般來說不會主動去測試 Private 方法,因為在測試 Public 方法時,Private 方法很有可能會是 Public 方法的一部分,所以其實就會一併測試到了。
我們終究是關注對外開放的行為(Public),所以才說不會特別主動測試 Private 方法,你可以想像本來 Private 方法的內容就是寫在 Public 方法當中,只是你把它抽出來而已,所以要視為一個整體來寫單元測試。
其實我覺得能拉到 80 ~ 90 % 就行了,只要確保含有大部分重要邏輯的程式有被涵蓋到就可以。
不變動的大前提是測試案例沒有任何變化,才有可能!
只要測試案例有變化,測試程式也要跟著做相對應調整,所以不大可能不變化!
舉個例子:
比如我 1 月寫出來的單元測試程式,直到 7 月都仍然可以使用的話,這就代表你的測試案例其實沒有顯著變化,因為需求沒有太大變動。
但程式總會因為新需求而有新變化,這時可能就要審視當下寫的單元測試是否還能應付當下情況,若不行就表示要調整了!
寫單元測試這件事要養成習慣不容易,可能也有很多人認為是沒必要的,但老實說單元測試能帶來的效益還是很驚人的!
之前在網路上有看到網友的一則留言,分享給各位:
好的程式架構和 OO 概念,都是透過被迫寫 UT 建立起來的。
如果能看懂這句話,表示你對單元測試有一定的了解,我當初看得是痛哭流涕那種...
感謝各位把文看完,若有一些疑問,歡迎指教與補充!
這篇主要講概念,下篇就會進入案例實作。
1. C# 的話,我是比較常在用 Moq,我還是盡量會找套件來幫忙,能不手動就不手動 XD
2. 這我可能會看異動的邏輯本身牽涉到什麼程度,如果是新案例,確實可能會傾向寫新測試,舊有測試內容就不會動,但如果牽涉的邏輯很深,就不太可能說完全不動舊有的測試(ex. 原程式直接把呼叫外部相依的做法整個換掉,這個應該就很難維持說舊有測試不變動)。
3. 程式涵蓋率不是 SonarQube 直接去算出來的(可參考 Test Coverage & Execution),SonarQube 主要是分析測試報告中的內容並將那些數據視覺化,所以就有辦法在 SonarQube 看到程式碼涵蓋程度,另外 .NET 應該有蠻多測試套件可以測試完就直接產生出測試報告(如果未來有找到不錯的,會在分享讓各位知道)。
4. 我是覺得寫不寫 UT 比較看個人,要想寫出讓人信服的程式碼,UT 可能就會是必經之路,路途中肯定是撞牆撞到不知道在幹嘛,但細細品味後就能海闊天空。至於程式是不是 UT 堆出來的?可能就可以參考 TDD(測試驅動開發流程),當我們以測試為前提來開發時,或許真的就是用 UT 來堆出程式...