????因為需要提高團隊代碼質量,暫時換個口味讀本講Unit Test的書。這本書全名 Effective Unit Testing? A guide for Java Developers. 作為讀書筆記,我只記錄一些個人感覺比較有價值的觀點。
Part 1 Foundations (第一部分,基礎)
? ? 全書第一部分有三章。作者認為現在(本書出版于2013年)寫Unit Test其實是一種業界規范了,所以關鍵不是要不要寫test的問題,而是如何寫好的test。前三章闡述了為什么要寫好的Test,怎么算是好的Test,還有專門一章講了Test Doubles(測試替身,作者還細分成fake, mock,stub,spy四種,等待后文詳述)的問題。
? ? 從test這個名字出發,大部分人的想法是為了抓住程序中的錯誤,從另一個方面來說,就是用來驗證程序的正確行為 (思考BDD)。更高層次的目的,是通過測試來驅動好的設計。此處插一句,從這兩個目的來看,雖然我們應該追求覆蓋率,但是就算百分之一百的代碼覆蓋率也只能說明通過測試代碼運行了這些代碼,不能說明測試真正驗證代碼應有的行為。
? ? 測試寫得越來越多,測試帶來的價值似乎就越來越小,作者用了一張圖來描述這種邊際效用遞減效應(高原效應)。橫軸是花在寫測試上的精力,縱軸是產生的價值,兩條線曲線實線代表作為質量工具的測試,虛線代表作為設計工具的測試。大部分團隊其實停留在把測試作為質量保證工具上,作者想說明的是我們應當努力把測試作為設計工具,才能移動到上一條曲線,收獲測試給我們帶來的更大的價值。
? ? 作者提出了他的理論:The biggest value of writing a test lies not in the resulting test but in what we learn from writing it. (寫測試最大的價值不在于寫出來的測試,而在于從寫測試過程中所學到的東西)。
? ? 開發者在忽視作為設計工具的測試的同時,也忽視了維護越來越龐大的測試的成本。如何減小這個成本,后文會詳述,這里作者提出了一個我認為十分重要的也是容易被我們忽略的觀點,要像對待產品代碼一樣來嚴肅對待測試代碼。好的測試代碼本身需要下功夫去設計,好的測試代碼必須也要考慮可維護性,在test中也存在技術債的問題。
? ? 測試可以影響開發效率,要提高開發效率,作者認為需要? 1. 縮短反饋的時間。 2. 減少debug(包括運行調試模式和修bug)的時間。?
????這里作者提出了test的四個屬性,以及這些屬性是如何影響開發效率的, a. 通過加快test的執行速度, 可以縮短反饋時間。b. 提高test的可讀性,可以減少調試的時間和減少bug。 c. 提高test的可信性(Trustworthiness ),提高測試結果的準確性,從而減少bug。 d. 提高測試的可靠性(可重復運行),提高測試結果的準確性,從而減少bug。通過對這四個屬性的增強,我們才能在作為質量工具的test上突破高原效應。
????另一方面,作為設計工具的test要求我們 1. 把測試像產品代碼一樣,不斷重構,保持高的測試代碼質量和設計,減少編寫, 維護, 運行這些測試的成本 。 2. 通過測試來驅動產品代碼的設計(TDD)。本書主要講如何寫出好的測試,所以將聚焦在第一點上。如何通過測試去驅動產品代碼的設計不是本書的重點。