【Java程序員修煉之道 之 單元測試】

單元測試是一個非常好用的工具,是一個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方法,並把查詢結果返回。

集成測試

集成測試是指集成了第三方依賴之後的測試。它會依賴於第三方環境,運行速度相對代碼測試慢。舉幾個例子:

  • 通過Http協議測試REST服務

  • 調用Dao類,測試它從數據庫裏面正確的獲取到了數據

實施單元測試的好處進行早期測試

在軟件工程中,大家都知道越早開始測試越好,越早開始測試就能越早發現缺陷,修改代價就越小。 
但是對於軟件系統的測試需要你至少編寫完一個可運行的最小化系統之後才能進行。在外人看到的可操作的界面出現之前,已經是開發人員好幾天努力工作的汗水了。但是按照傳統的工作方法,所有的這些努力,在界面沒有出來之前,除了知道他們是可以編譯通過的,無法進行任何測試。更甚的是,如果你的系統依賴於一個未實現的第三方系統,那麼在那個第三方系統能正確響應你的請求之前,你的代碼得不到任何有效的測試。 
但是使用單元測試技術,通過使用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,看起來很美,還沒有用過,等我學習使用完覺得好用了再分享。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章