本文介紹Junit的最基本的東西,包括簡單的使用,和斷言、測試異常,捕獲異常,測試方法的性能。
轉自:http://huihai.iteye.com/blog/1986568
Junit目前在一些大的公司或者相對規范的軟件中使用的比較多,相當多的小公司並沒有把單元測試看的太重要。在大點的公司開發人員每天上班后,第一件事情就是從svn上把自己負責的代碼checkout下來,然后運行單元測試,如果單元測試通過,那么說明自己的代碼沒有問題,然后就在代碼塊上修改與添加,完成后再用junit進行測試,測試完成后如果沒有問題,那么就把相應的代碼塊提交給svn上。
測試一般分為:單元測試、集成測試(主要看一塊代碼加進去后,系統會不會有問題)、驗收測試和壓力測試。
在以前的的項目中也用過Junit,當時的使用只是把Junit當成一個有多個main方法的一個函數。假如一個項目非常的大,測試的東西非常的多,如果不用Junit的話,那么這個工作量是非常大的。單元測試的最基本的一個功能是能進行自動化測試。單元測試都是通過斷言的方式來確定結果是否正確,即使用Assert。
1、從網站上下載junit的新版本,http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22junit%22%20AND%20a%3A%22junit%22 上下載相應的版本,這里下載的是junit4.10
2、在myeclipse中新建一個java項目,名稱為junit01,並在新建一個文件夾,名稱為lib,把上面下載的junit-4.10復制到里面,並build path,即添加到類路徑中,如下圖所示:
3、新建一個類Calcuate,其功能主要實現加減乘除,如下圖所示,其所在的包為cn.whp.util
4、創建上面的類Calcuate中新建測試類,首先在myeclipse中創建一個source folder,將其命名成test,然后在其下創建一個與類Calcuate類在相同包的包,如下圖所示:
5、junit3與junit4的區別還是比較明顯的,在junit3中,如果某個類是測試類,必須將其繼承類TestCase,如果某個方法是測試方法,必須讓這個方法以testXX開頭,如果希望指定某個測試方法運行之前運行某個初始化方法,這個方法的名稱必須是setUp,如果希望在某個測試方法運行之后運行某個釋放資源的方法,這個方法的名稱必須是tearDown。
在junit4中,一個POJO類就是一個測試類,測試方法通過@Test來標識,初始化方法通過@Before來標識,釋放資源的方法通過@After來標識,但是為了讓junit4的測試類在junit3中也可以使用,習慣於把初始化方法命名為setUp,釋放資源的方法命名為tearDown。Test中的測試方法一般以Test來開始。其中標識為Before注解的方法,每次運行測試類,都會執行標識為@After與@Before的方法。如下圖所示:
6、在junit4中提供了一個Assert的類,這個類中有大量的靜態方法進行斷言的處理,在junit3中由於繼承了TestCase,這個TestCase就可以直接assert,而junit4中需要先引入Assert類。如下圖:
在上圖中使用了Assert類中的assertEquals方法,這方法的第一個參數意思是:如果方法cal.add(12,22)計算的結果不為34,那么就會打印出“加法有問題”的信息。第二個參數為方法cal.add(12,22)的執行結果,第三個參數是開發人員預計的函數cal.add(12,22)執行后的結果,這里預計12與22相加后其結果為34,如果在執行測試方法后,rel不等於34,那么就會報加法有問題。如果結果等於34,那么這個方法就測試通過。把上圖中最后一個參數的值34改成35,那么執行junit測試后將會出現如下錯誤:
如果想讓上面的測試類可以在junit3中運行,可以把Assert類靜態的導入,這樣在調用每個靜態方法時,就不用都寫上Assert類了,如下圖所示:
然后把所有別的測試方法補全,使用junit測試比使用main方法測試有很大的不同的,每個標識為@Test的方法都是一個可運行的方法,並且他們之間互不影響,例如testAddd方法出現問題了,並不影響testMinus方法的運行。這就是單元測試的好處,如下圖:
7、在測試除法cal.divide(3,0),如果除數為0,這個方法應該會拋出異常。現在的測試目標是,如果運行測試方法后,測試方法沒有拋出異常,那么這個測試方法就不能通過。這時就需要用到junit的ArithmeticException。如下圖所示:
這里如果把cal.divide(20,0)改成cal.divide(20,10),這樣divide是沒有問題的,但是這時測試類中的testDivideException方法執行junit測試后就不能通過了,因為這個測試方法已經斷言所要測試的方法divide要拋出異常,結果沒有拋出異常,所以junit測試是不能通過的。如下圖所示:
測試結果提示,應該拋出一個異常,結果沒有拋出異常。
8、有時在測試時需要有這樣的需求,就是對一個方法的時間進行測試,例如,要讓一個方法,200毫秒里運行完,如果這個方法200毫秒不能運行完,那么這個方法就應該拋出異常,示例中將方法time中線程沉睡300毫秒,那么這個方法就不可能在200毫秒內完成,所以這個方法就會拋出異常。這就可以做一些方法性能上的測試,把Thread去掉,那么這個測試就可正常通過。如下圖所示: