單元測試的藝術(第二版) 筆記

單元測試的藝術(第二版) 讀書筆記

為The Art of Unit Testing With Examples in C# 的中譯版本,譯者為業界知名的講師91

書籍介紹

單元測試的藝術(第二版)

本書前半部分講述如何開始撰寫單元測試、單元測試的技巧、介紹隔離框架與用法,後半部分著重於如何撰寫好的單元測試、以及在組織或團隊中要導入開發測試程式,會遇到的困難與解決方法。

一個優秀的單元測試所具備的特質

  • 自動化
  • 容易撰寫
  • 執行快速
  • 重複執行得到一樣的結果

單元測試的命名慣例

  • 專案:[專案名稱].UnitTests
  • 類別:[被測試類別名稱]Tests
  • 測試案例:[工作單元(方法名稱或是抽象的描述)][情境][預期結果]

單元測試框架-NUnit

NUnit

單元測試的核心技術

  • 虛設常式(Stub):產生一個可控物件,代替一個外部的相依物件,不會對虛設常式進行驗證
  • 模擬物件(Mock):驗證被測試物件是否如預期般呼叫這個假物件,會對模擬物件進行驗證

在單元測試中,可以使用自己實作虛設常式與模擬物件,但自己實作這些類別比較花費時間,在一般的情況下,可以使用模擬框架來實作。

隔離模擬框架-NSubstitute

NSubstitute

測試階層與組織

  • 測試自動化,使用自動化建置流程,頻繁的執行測式
  • 將整合測試與單元測試分開,建立綠色安全區域,確保區域內的測試都可以通過

好的單元測試的支柱

可信賴

  • 決定何時刪除或修改測試
  • 避免測試中帶有邏輯:避免出現邏輯判斷(if、switch)與迴圈(foreach、for、while)
  • 每次只測試一個關注點
  • 把單元測試與整合測試分開
  • 用程式碼審查確保程式碼覆蓋率

可維護性

  • 只測試公開的方法
  • 去除重複的程式碼
  • 實作測式隔離
  • 避免對不同的關注點進行多次驗證

可讀性

  • 命名單元測試與變數
  • 有意義的驗證
  • 驗證與操作分離

在組織中導入單元測試

找到可能的切入點

  • 選擇小團隊
  • 建立子團隊
  • 考慮專案的可行性
  • 使用程式碼與和測試審查作為工具

成功之道

  • 游擊式的進行(由下而上):由開發者採納這樣的變革,管理者也願意支持
  • 說服高層(由上而下):藉由管理職權直接進行變革
  • 引入外援:透過外部顧問來進行變革
  • 讓進度可見
  • 設定具體目標:提高測試程式覆蓋率,同時也要進行程式和測試審查、減少重複出現的bug、降低修復bug的時間
  • 應對阻礙

失敗原因

  • 缺乏驅動力
  • 缺乏政策支援
  • 糟糕的實現和第一印象
  • 缺少團隊支持

結語

這不單單是一本講述單元測試實作與技術面的書,同時也提到技術決策面與管理面的問題。我自己的經驗是,在時程很緊迫的情況下,通常被犧牲的一定都是測試,有些管理階層會說這些測試交由QA人員測試即可,但我認為,如果開發程式沒有用單元測試來驗證自己的功能是不是正確,那根本不算是真正的完成。有單元測試的保護,在進行程式需求變更或重構時也比較有信心不會改壞,也會讓新的人員加入團隊時,只要看一下單元測試就可以了解目前的程式提供了什麼功能,加快了解程式的速度。