概述
第十二章圍繞單元測試展開,闡述了單元測試的實踐與重要性,通過對比其他測試類型,突出其特點,還介紹了單元測試的最佳實踐、避免的反模式以及與測試替身相關的內容,為編寫高質量單元測試提供指導。
章節概要
1. 單元測試的重要性
單元測試是測試中范圍較窄的類型,通常針對單個類或方法。
單元測試通過快速、確定性的測試幫助工程師提高生產力。
單元測試應覆蓋代碼的核心邏輯,確保代碼變更不會引入缺陷。
2. 測試的可維護性
測試代碼應盡量減少維護成本,只在必要時更新。
測試的脆弱性(如因無關變更而失敗)會顯著增加維護負擔。
測試應通過公共API進行,避免依賴實現細節。
3. 防止脆弱測試
不變的測試:測試代碼應盡量減少變更,除非系統行為發生變化。
通過公共API測試:測試應模擬系統的真實使用方式。
測試狀態而非交互:關注系統的最終狀態,而不是內部交互過程。
4. 編寫清晰的測試
測試的完整性和簡潔性:測試代碼應包含所有必要信息,同時避免無關細節。
基于行為的測試:測試應關注系統的具體行為,而不是方法的實現。
清晰的測試結構:測試應明確包含“給定”、“當”、“則”三個部分。
有意義的測試名稱:測試名稱應清晰描述被測試的行為。
避免測試中的邏輯:測試代碼應盡量避免復雜的邏輯,保持簡單直接。
清晰的失敗信息:測試失敗時,應提供明確的錯誤信息。
5. 測試代碼的共享:DAMP優于DRY
測試代碼應優先追求描述性和有意義,而不是完全避免重復。
測試代碼的共享應通過輔助方法實現,而不是依賴全局變量或復雜的初始化邏輯。
6. 測試基礎設施
測試基礎設施(如測試框架或工具)應標準化,以提高測試的可維護性。
測試基礎設施本身也需要測試,以確保其正確性和穩定性。
總結
單元測試是軟件工程師確保系統在面對未預見變更時仍能正常工作的強大工具。通過遵循本章介紹的最佳實踐,測試可以顯著提高代碼質量,減少維護成本。Google的單元測試實踐表明,清晰、穩定且易于維護的測試是提高開發效率的關鍵。
精彩語錄
1.“測試的主要目的是防止缺陷,其次是提高工程師的生產力。”
“After preventing bugs, the most important purpose of a test is to improve engineers’ productivity.”
解釋:單元測試通過快速反饋幫助工程師快速定位問題,從而提高開發效率。
2.“測試的可維護性是關鍵:好的測試應該‘一勞永逸’。”
“Maintainable tests are ones that ‘just work’: after writing them, engineers don’t need to think about them again until they fail.”
解釋:測試代碼應盡量減少維護成本,只在必要時更新。
3.“測試應該通過公共API進行,而不是依賴于實現細節。”
“Test via Public APIs.”
解釋:通過公共API測試可以減少測試的脆弱性,確保測試與系統的實際使用方式一致。
4.“測試狀態,而不是交互。”
“Test state, not interactions.”
解釋:關注系統的最終狀態比關注內部交互更能反映系統的實際行為。
5.“測試的清晰性至關重要:測試失敗時,工程師應能迅速定位問題。”
“A clear test is one whose purpose for existing and reason for failing is immediately clear to the engineer diagnosing a failure.”
解釋:清晰的測試能夠快速幫助工程師理解測試的意圖和失敗的原因。
6.“測試應關注行為,而不是方法。”
“Test behaviors, not methods.”
解釋:基于行為的測試比基于方法的測試更清晰、更穩定。
7.“測試代碼應遵循DAMP原則,而不是DRY原則。”
“Tests and Code Sharing: DAMP, Not DRY.”
解釋:測試代碼應優先追求“描述性和有意義”,而不是完全避免重復。