在junit4中開始使用這樣的包結(jié)構(gòu):org.junit.* ,而不再像以前使用這樣的包結(jié)構(gòu):junit.framework.*,但是為了向后兼容,在Junit4中將會讓這兩種包結(jié)構(gòu)并存
繼承上的變化
你的測試類再也不需要extends這個類junit.framework.TestCase了,而且不用顯示的繼承任何一個類,Junit通過采用JDK 5.0的annotations特性來完成了這種轉(zhuǎn)變。如果想要執(zhí)行一個test case,只需要在你的測試類中至少包含一個這樣的annotation可以了@Test。
打個比方,如果你寫了這樣的一個類,里面只包含了@Before 和 @After這樣的annotation,卻沒有包含任何的@Test,那么在你開始運行這個測試類的時候,你會碰到一個java的異常:java.lang.Exception: No runnable methods.
斷言方法的變化
因為在Junit 4中,測試類不再繼承TestCase(在這個類里JUnit 3.8版本中定義了assertEquals()等方法),所以你需要使用一個前綴的語法像這樣:Assert.assertEquals(),或者用JDK 5.0中的靜態(tài)導(dǎo)入,來導(dǎo)入Assert,之后,你可以像之前那樣使用assertEquals等等這些方法了
另外,在Junit 4中增加了兩個新的斷言方法,他們用來比較兩個對象數(shù)組,如果兩個數(shù)組中的每個元素都是equal的,那么認(rèn)為這兩個數(shù)組是equal的:
public static void assertEquals(String message, Object[] expecteds, Object[] actuals);
public static void assertEquals(Object[] expecteds, Object[] actuals);
還有12個assertEquals 方法已經(jīng)因為JDK 5.0中的autoboxing功能而徹底消失了。像這樣assertEquals(long, long) 之前在JUnit 3.8中使用的方法,現(xiàn)在已經(jīng)都統(tǒng)一改用assertEquals(Object, Object)方法。
Fixture
Fixtures是在測試期間用來初始化(initialize)和釋放(release)對象的一些方法,在 In JUnit 3.8中,需要用setUp() 方法在運行測試方法之前進(jìn)行一些初始化的工作,然后在測試完成之后用tearDown() 方法來進(jìn)行善后工作。這兩個方法都是從父類TestCase 中override過來的,因此他們的方法聲明及方法名稱是固定的。在JUnit 4中我們只要使用這兩個annotation:@Before 和 @After 可以達(dá)到同樣的目的了,而且我們不用再強(qiáng)制的讓方法必須叫這兩個名字了。^_^
測試方法上的變化
在JUnit 3.8中,用來標(biāo)識一個測試方法是通過它的方法簽名來實現(xiàn)的,即方法必須以一個"test"的前綴來命名,且必須為void,而且必須沒有任何參數(shù)(比如:public void testDivide()),那些不遵循這種命名規(guī)則的方法將會被簡單的忽略掉,而且不會拋出任何異常來表面已經(jīng)發(fā)生了錯誤。
在JUnit 4中沒有命名上的限制了,只需要在測試方法的簽名加上一個這樣的annotation可以了:@Test,像之前的限制:方法必須為void,而且必須沒有任何參數(shù),這些還是一樣需要,只是限制改為,如果沒有遵守這些限制,則會在運行的時候拋出下面的異常:
java.lang.Exception: Method xxx should have no parameters
java.lang.Exception: Method xxx should be void
另外,@Test支持可選的expected參數(shù),用來聲明這個測試方法可以拋出一個異常,如果在測試時沒有拋出異常,或者拋出了一個其他的異常,都會認(rèn)為測試是失敗的。比如可以這樣來聲明@Test(expected = ArithmeticException.class)。
忽略一個測試方法
如果你在測試之前知道某個方法測試一定會失敗,但是,你又不想讓測試失敗,那么你怎么臨時的讓這個測試方法被忽略掉呢?在JUnit 3.8中要么將這個方法注釋掉,要么需要改變方法名稱,即不使用test前綴開頭來命名方法,問題是當(dāng)測試的方法很多時,你可能不記得你重命名過的這個方法了。而在JUnit 4中可以通過去掉方法前面的@Test annotation來達(dá)到目的,但是上面的問題依然存在,一個解決方案是:在需要測試的方法前/后即@Test的前面或者后面加上@Ignore 可以了,后在測試報告中將會顯示出有多少方法被忽略掉了,同時會顯示多少方法運行成功,以及多少方法運行失敗。Note:@Ignore 有一個可選的參數(shù),可以用它來簡單的記錄為什么這個方法被忽略掉了。
運行測試
在JUnit 3.8中你可以有多種運行方式:text, AWT或者Swing,但是在JUnit 4中僅使用text方式。