單元測試是一個非常好用的工具,是一個Java程式員修養的一部分。從04年開始,我就開始在項目實踐中使用單元測試。十幾年來,參與的項目基本上都或多或少的使用了單元測試,多的能有100%覆蓋率的要求,少的也要覆蓋主要代碼,發現這個實踐在提高軟體品質和開發速度上還是很有好處的。在和朋友同事的交流中,發現有很多項目沒有使用單元測試,也有很多程式員不會寫單元測試,但是大家對這個都很有興趣。所以我想把自己掌握的關於單元測試的技能(架構、設計和技術)和實施策略分享一下。當然,要是有那個企業願意要求我去做相關的內訓和諮詢,我會很高興的。 單元測試這系列想講講兩方面內容: 1. 如何項目中使用單元測試 2. Java單元測試的技術 3. 一些實施單元測試的誤區 本文包括下面幾部分的內容 1. 我所理解的單元測試的定義和分類 2. 實施單元測試的好處 3. Java程式員單元測試工具庫 單元測試的定義和分類單元測試的定義指程式員編寫的用於測試邏輯代碼的代碼。我的理解中單元測試分成以下兩類: 代碼測試代碼測試是指對代碼的實現進行測試,不依賴於第三方環境,運行速度很快。舉幾個例子:
測試aController對象的doGet方法正確的把參數P1和P2傳遞給了bService對象的query方法
測試一個Dao類的get方法正確的把"select a,b from t where l=5"傳遞給jdbcTemplate的query方法,並把查詢結果返回。
整合測試整合測試是指整合了第三方依賴之後的測試。它會依賴於第三方環境,運行速度相對代碼測試慢。舉幾個例子:
實施單元測試的好處進行早期測試在軟體工程中,大家都知道越早開始測試越好,越早開始測試就能越早發現缺陷,修改代價就越小。 但是對於軟體系統的測試需要你至少編寫完一個可啟動並執行最小化系統之後才能進行。在外人看到的可操作的介面出現之前,已經是開發人員好幾天努力工作的汗水了。但是按照傳統的工作方法,所有的這些努力,在介面沒有出來之前,除了知道他們是可以編譯通過的,無法進行任何測試。更甚的是,如果你的系統依賴於一個未實現的第三方系統,那麼在那個第三方系統能正確響應你的請求之前,你的代碼得不到任何有效測試。 但是使用單元測試技術,通過使用Stub和Mock技術,我們可以不用依賴介面,不用依賴第三方系統,就可以對代碼進行測試處,甚至,你可以實現一個方法就測試一個方法,不用等整個功能都完成了再測試。 可以放心的修改代碼以及進行代碼重構單元測試是可以自動化啟動並執行,如果代碼有良好的單元測試覆蓋,在對代碼進行重構和修改之後,我們可以用極短的時間(幾分鐘)對整個系統進行一下測試,測試全部通過,這個說明的修改對系統沒有造成嚴重影響(這不能說明單元測試覆蓋不到的地方也沒有問題),於是你就可以安心的繼續修改代碼和重構代碼。 有助於提高代碼品質和架構設計為了便於單元測試和代碼覆蓋,架構必然會在邏輯封裝,解耦合,依賴注入,控制反轉,對外介面封裝等方面進行最佳化。 舉幾個例子:
可重複對代碼進行驗證編寫良好的單元測試代碼可以自動化運行,可以在所有的開發人員的環境裡運行,可以在持續整合環境裡運行,可以在每次代碼修改提交後運行,項目的代碼和功能在反覆的收到測試。 加快開發速度前期的小小投入,能夠在整個項目周期中發揮作用,能夠提高代碼的品質,能夠對代碼進行早期測試,能夠減少代碼Bug,能夠保證代碼不會被其他代碼破壞。修改Bug和調試的時間、相關的溝通時間被大幅度的減少。項目時間能更有保證。 起到代碼文檔的作用對於一個方法或者一個對象的使用,有的時候光用注釋很難說清楚。單元測試中對該方法/對象的使用提供了執行個體說明的作用,使我們更容易理解對其的使用。 Java程式員單元測試工具庫寫單元測試也是需要掌握一些工具的,不過這些工具使用起來都比較簡單,也和容易學習。在後面的文章中,我將會介紹其中的一部分我經常用到的。 單元測試架構在Java世界中,有兩個使用最多的單元測試架構,JUnit和TestNG。使用最多和支援最廣泛的是JUnit。後面的文章中我將會給大家介紹一下它的使用。 Mock工具Mock工具是進行代碼測試所必須掌握的一個工具。目前流行的有Mockito, EasyMock和JMock這三種。我以前用過EasyMock和JMock,後來開始使用Mockito之後就停不下來了。後面的文章中會給大家介紹一下它的用法。 其他工具通用型的我將會介紹Hamcrest,一個用於驗證測試結果工具庫。其他的有一些用於各種專門目的而使用的工具,這類工具有很多,比如
Spring Test,用於對Spring程式進行整合測試的必需品,我將會在後面的文章中介紹
Spring MVC Test Framework,一個用於Spring MVC編寫的Web應用的工具,我將會在後面的文章中介紹
DBUnit,這個也有很多人用,但是我基本上沒用過,所以就不介紹了。有興趣的可以自己去看看。
rest-assured, Java DSL for easy testing of REST services,看起來很美,還沒有用過,等我學習使用完覺得好用了再分享。
|