1.2.2 JUnit4引入了一個JUnit3中沒有的新特性——類范圍的 setUp() 和tearDown() 方法。
任何用 @BeforeClass 注釋的方法都將在該類中的測試方法運行之前剛好運行一次,而任何用@AfterClass注釋的方法都將在該類中的所有測試都運行之后剛好運行一次。
1.2.3 異常測試:
異常測試是Junit4中的大改進(jìn)。Junit3的異常測試是在拋出異常的代碼中放入try塊,然后在try塊的末尾加入一個fail()語句。
例如該方法測試一個被零除拋出一個ArithmeticException:
該方法不僅難看,而且試圖挑戰(zhàn)代碼覆蓋工具,因為不管測試是否通過還是失敗,總有一些代碼不被執(zhí)行。在JUni4中,可以編寫拋出異常的代碼,并使用注釋來聲明該異常是預(yù)期的:
如果沒有異常拋出或者拋出一個不同的異常,那么測試將失敗。
1.2.4 JUnit4添加了兩個比較數(shù)組的assert() 方法:
public static void assertEquals(Object[] expected,Object[]actual)
public static void assertEquals(String message, Object[]expected,Object[] actual)
這兩個方法以直接的方式比較數(shù)組:如果數(shù)組長度相同,且每個對應(yīng)的元素相同,則兩個數(shù)組相等,否則不相等。數(shù)組為空的情況也作了考慮。
1.3 JUnit 4 常用的幾個annotation 介紹
★ @Before:初始化方法,在任何一個測試執(zhí)行之前必須執(zhí)行的代碼;
★ @After:釋放資源,在任何測試執(zhí)行之后需要進(jìn)行的收尾工作;
★@Test:測試方法,表明這是一個測試方法。對于方法的聲明也有如下要求:名字可以隨便取,沒有任何限制,但是返回值必須為void,而且不能有任何參數(shù)。如果違反這些規(guī)定,會在運行時拋出一個異常。至于方法內(nèi)該寫些什么,那要看你需要測試些什么了;在這里可以測試期望異常和超時時間,如@Test(timeout=100),我們給測試函數(shù)設(shè)定一個執(zhí)行時間,超過了這個時間(100毫秒),它們會被系統(tǒng)強行終止,并且系統(tǒng)還會向你匯報該函數(shù)結(jié)束的原因是因為超時,這樣你可以發(fā)現(xiàn)這些Bug了。
★@Ignore:忽略的測試方法,標(biāo)注的含義是“某些方法尚未完成,暫不參與此次測試”;這樣的話測試結(jié)果會提示你有幾個測試被忽略,而不是失敗。一旦你完成了相應(yīng)函數(shù),只需要把@Ignore標(biāo)注刪去,可以進(jìn)行正常的測試。
★ @BeforeClass:針對所有測試,只執(zhí)行一次,且必須為static void;
★ @AfterClass:針對所有測試,只執(zhí)行一次,且必須為static void;
所以一個Junit 4 的單元測試用例執(zhí)行順序為:@BeforeClass –> @Before –>@Test–> @After –> @AfterClass;每一個測試方法的調(diào)用順序為:@Before –>@Test–> @After。
如下面例子:
import static org.junit.Assert.*; importorg.junit.After;importorg.junit.AfterClass;importorg.junit.Before;importorg.junit.BeforeClass;importorg.junit.Ignore;importorg.junit.Test; public class JUnit4Test{
@Before
public void before() {
System.out.println(@Before);
}
@Test
public void test() {
System.out.println(@Test);
assertEquals(5 + 5, 10);
}
@Ignore
@Test
public void testIgnore() {
System.out.println(@Ignore);
}
@Test(timeout = 50)
public void testTimeout() {
System.out.println(@Test(timeout = 50));
assertEquals(5 + 5, 10);
}
@Test(expected = ArithmeticException.class)
public void testExpected() {
System.out.println(@Test(expected = Exception.class));
throw new ArithmeticException();
}
@After
public void after() {
System.out.println(@After);
}
@BeforeClass
public static void beforeClass() {
System.out.println(@BeforeClass);
};
@AfterClass
public static void afterClass() {
System.out.println(@AfterClass);
};
};