TDD (Test-driven development) 即測試驅動開發,要求開發者在編寫某個功能的代碼之前先編寫測試代碼,然后只編寫使測試通過的功能代碼,通過測試來推動整個開發的進行。這有助于編寫簡潔可用和高質量的代碼,并加速開發過程。
但對于 TDD 的爭論一直沒有停止,而最近在 twitter 上關于 TDD 是否有損軟件架構的爭論再起。這里著名的 Robert C. Martin (Uncle Bob Martin) 寫了一篇博文發表自己的觀點,也推薦大家看看 Rails 之父 DHH 相反觀點的一篇文章,然后自己加以判斷。
對于 TDD 一個常見的觀點就是「當你有了越來越多的測試時,也就意味著越來越難以改動業務代碼。因為改動會造成很多的測試失敗而需要修正,所以測試會讓業務代碼變得死板,難以改動」。
對此 Uncle Bob 展示了一幅圖:
對于哪一邊更好相信不用多說,右邊的設計明顯更加合理。
右半邊的圖用到了經典的 OCP (Open-Closed Principle) 和 DIP (Dependency Inversion Principle) 原則。與用戶直接聯系的是 API,而服務端負責實現 API,因此用戶基本不會直接察覺到服務端的變動。
文中,Uncle Bob 提示大家將上圖中的 USER 替換成 TEST 再思考。測試和業務代碼一樣也需要好好設計,而大多數人只是簡單的寫出一一對應的測試代碼,那當然會難以改動,產生各種各樣的問題。Uncle Bob 認為設計模式等改善代碼結構的原則同樣可以用于測試代碼中,并且應該將測試代碼和業務代碼放在同樣重要的地位。
就結論來說,Uncle Bob 認為 TDD 本身并不會傷害軟件架構,是開發者不會用。也就是如果你不能好好組織設計你的測試代碼,意味著你寫的業務代碼也好不到哪兒去。是你自己而不是 TDD 損害了你的軟件結構。
原文轉自:https://zhuanlan.zhihu.com/p/25571122