JUnit 4
JUnit 4全面引入了Annotation來執行我們編寫的測試。
關於JUnit 3的使用可以參見:http://www.cnblogs.com/mengdd/archive/2013/03/26/2983565.html
使用JUnit 4進行測試:
1.新建項目,引用JUnit 4類庫。
2.新建立source folder,存放測試類代碼,但是注意測試類代碼和被測試代碼的包名一致。
3.編寫被測試類代碼。
前面的都是和JUnit 3類似的,下面就開始不同了:
4.編寫測試類代碼:
JUnit 4並不要求測試類繼承TestCase父類。
測試方法上面需要加上一個Annotation:@Test
在一個測試類中,所有被@Test注解所修飾的public,void方法都是test case,可以被JUnit所執行。
Test文檔:
org.junit
Annotation Type Test
--------------------------------------------------------------------------------
@Retention(value=RUNTIME)
@Target(value=METHOD)
public @interface Test
The Test annotation tells JUnit that the public void method to which it is attached can be run as a test case.
To run the method, JUnit first constructs a fresh instance of the class then invokes the annotated method.
Any exceptions thrown by the test will be reported by JUnit as a failure.
If no exceptions are thrown, the test is assumed to have succeeded.
最佳實踐
JUnit 4不再要求方法的名字,可以給測試方法任意命名,但是為了可讀性,還是建議以test開頭命名,如JUnit 3要求的那樣。
如何實現JUnit 3中的setUp()和tearDown()
比如測試前面用過的計算的類:

package com.mengdd.junit4; public class Calculator { public int add(int a, int b) { return a + b; } public int subtract(int a, int b) { return a - b; } public int multiply(int a, int b) { return a * b; } public int divide(int a, int b) throws Exception { if (0 == b) { throw new Exception("除數不能為0"); } return a / b; } }
現在要測試這個類中的前三個方法,寫出測試類如下:

package com.mengdd.junit4; import org.junit.Test; import static org.junit.Assert.assertEquals;//靜態導入 public class CalculatorTest { @Test public void testAdd() { Calculator cal = new Calculator(); int result = cal.add(3, 5); assertEquals(8, result); } @Test public void testSubstract() { Calculator cal = new Calculator(); int result = cal.subtract(1, 6); assertEquals(-5, result); } @Test public void testMultiply() { Calculator cal = new Calculator(); int result = cal.multiply(5, 9); assertEquals(45, result); } }
這樣是可以完成測試功能,如何避免重復呢?
就好像JUnit 3的時候把創建對象的代碼放在setUp()中那樣。
JUnit 4中還是依靠注解來解決:@Before
被這個注解標注的方法會在每個測試用例之前被調用。
相應的,對應於tearDown()方法的是用@After實現的。
這兩個方法會在每一個測試用例的前后被調用,所以可以用來創建對象,對於每個測試用例來說都是一個新的對象。
全局的初始化和銷毀:@BeforeClass和@AfterClass
@BeforeClass:在所有的方法調用之前調用的一個方法;用來進行一些開銷昂貴的初始化操作,比如連接數據庫。
@AfterClass:在所有的方法調用之后調用的方法。
注意這兩個修飾符修飾的方法必須是public static void的,並且沒有參數(no-arg)。
Note:
即便@BeforeClass修飾的方法拋出異常了,@AfterClass修飾的方法也會照常執行。
基類的@BeforeClass方法會在子類的@BeforeClass方法之前進行;而基類的@AfterClass方法會在子類的@AfterClass方法之后進行。
修改后的代碼如下:

package com.mengdd.junit4; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals;//靜態導入 public class CalculatorTest { private Calculator cal = null; @BeforeClass public static void globalInit() { System.out.println("global Init invoked!"); } @AfterClass public static void globalDestroy() { System.out.println("global Destroy invoked!"); } @Before public void init()//setUp() { cal = new Calculator(); System.out.println("init --> cal: " + cal); } @After public void destroy()//tearDown() { System.out.println("destroy"); } @Test public void testAdd() { System.out.println("testAdd"); int result = cal.add(3, 5); assertEquals(8, result); } @Test public void testSubtract() { System.out.println("testSubtract"); int result = cal.subtract(1, 6); assertEquals(-5, result); } @Test public void testMultiply() { System.out.println("testMultiply"); int result = cal.multiply(5, 9); assertEquals(45, result); } }
@Ignore
@Ignore注解可用於修飾測試類與測試方法,被@Ignore所修飾的方法或類中的測試(@Test修飾的測試)將不會被執行。
@Ignore中可以加上參數值,說明忽略測試的原因。
參考資料
聖思園張龍老師視頻教程。
JUnit4 chm格式文檔網盤下載鏈接:
JUnit 4.0:http://pan.baidu.com/share/link?shareid=539345&uk=2701745266