這篇文章算是一個翻譯了。分成兩部分,集合了兩篇 JUnit.org 上的推薦文章,這里是原文的地址:
http://www.instrumentalservices.com/index.php?option=com_content&task=view&id=45&Itemid=52
http://www.devx.com/Java/Article/31983
JUnit 我就不多做介紹了, Kent Beck 和 Erich Gamma 的作品。這里主要講一下在 JUnit 4.0 和 4.1 版本中的一些改進和新的用法。
要很好的使用 JUnit 4.x ,必須要 Java SE 5.0 ,因為這個版本最大的變化就是加入了大量的 Annotation 的使用。
來通過一個例子看下,首先是一個老版本的測試案例:
有幾點需要關注:
1 —— 一個測試案例必須要繼承自 TestCase ;
2 —— JUnit 是通過反射機制來執行每一個 test 方法,它通過匹配方法名 testXXX 來確定一個方法為需要執行的測試 Case 。
3 —— 使用一個或幾個 assertXXX 方法來驗證我們的情況。
好,現在使用 JUnit 4.x 來實現相同的測試,從中,我們就能看到一些新的東西:
首先關注以下幾點:
1 ——我們的測試類并沒有 extends TestCase 類了,
2 ——我們的測試方法并沒有以 test 開頭,而是使用了 @Test 標簽來標記該方法是一個需要測試的方法。
下面的圖標示了用 JUnit 4.x 我們需要做的事情:
1 ——我們需要引進 org.junit.Test 標簽,還有很多標簽都在 org.junit.* 包里面。
2 ——引進 static assertEquals 靜態方法,引入靜態方法也是 Java 5 的一個新的特性,避免了使用過長的應用方法名。
3 ——引進 JUnit4TestAdapter ,這是一個和老版本 JUnit 工具合用的適配器。
4 ——使用 @Test 標簽來申明一個方法需要測試。
5 ——直接使用需要的 assert 方法
6 ——使用一個 main 方法來用 JUnit4TestAdapter 在老的 Junit runner 上運行新的測試。
總結一下:
l???????? 使用一個普通的類,而不必繼承自 Junit.framework.TestCase 。
l???????? 使用 @Test 標簽來標記一個方法是一個測試方法。
l???????? 使用一個 assert 方法。在新版本的 Junit 中, assert 方法和老方法沒有什么區別。并且使用靜態方法引入,( static import )特性來簡化方法的使用。
l???????? 使用 JUnit4TestAdapter 來運行測試。
Set up 和 tear down
新版本的 JUnit 提供了兩個新的標簽來使用 set up 和 tear down :
@Before :使用了該標記的方法在每個測試方法執行之前都要執行一次。
@After :使用了該標記的方法在每個測試方法執行之后要執行一次。
這里有個測試的例子:
如果我們在所有的方法中都添加一個 System.out.println() 方法,執行的結果會像這樣:
?????? runOnceBeforeAllTests() 被調用;
bookNotAvailableInLibrary() 被調用;
bookAvailableInCentralLibrary ()被調用;
runAfterAllTests ()被調用,
而如果我們還有一個 @Before beforeTest() 方法和一個 @After afterTest() 方法,那么執行的結果會是這樣:
?????? runOnceBeforeAllTests() 被調用;
?????? beforeTest() 被調用;
bookNotAvailableInLibrary() 被調用;
afterTest ()被調用;
beforeTest() 被調用;
bookAvailableInCentralLibrary ()被調用;
afterTest ()被調用;
runAfterAllTests ()被調用,
從這里我們就可以看出兩者的區別了。
另外一點, @Before 和 @After 標示的方法只能各有一個。
錯誤處理:
在 JUnit4.0 之前,對錯誤的測試,我們只能通過 fail 來產生一個錯誤,并在 try 塊里面 assertTrue ( true )來測試?,F在,通過 @Test 標簽中的 expected 屬性,就可以更優雅的測試錯誤了:
在這段代碼中,我們為 @Test 標簽添加了 expected 屬性,并提供了一個 BookNotAvailableException ,那么在這段測試中,如果代碼沒有拋出這個類型的錯誤,測試就失敗了,如果正確拋出該類型錯誤,測試通過。
其他的標簽:
@ignore 標簽:
該標簽標記的測試方法在測試中會被忽略。當測試的方法還沒有實現,或者測試的方法已經過時,或者在某種條件下才能測試該方法(比如需要一個數據庫聯接,而在本地測試的時候,數據庫并沒有連接),那么使用該標簽來標示這個方法。同時,你可以為該標簽傳遞一個 String 的參數,來表明為什么會忽略這個測試方法。比如: @lgnore(“ 該方法還沒有實現 ”) ,在執行的時候,僅會報告該方法沒有實現,而不會運行測試方法。
@Test(timeout=xxx):
該標簽傳入了一個時間(毫秒)給測試方法,
如果測試方法在制定的時間之內沒有運行完,則測試也失敗。
這篇文章就到這里,其實
JUnit4.x
里面還有很多標簽的用法,將在明天的
blog
中繼續。
?(注:本文作者,EasyJF開源團隊 stef_wu,轉載請保留作者聲明!)