您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
全面認(rèn)識JUnit 4的特征
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2013/1/4 15:58:25 ] 推薦標(biāo)簽:

  三、 包

  首先,你可以看到,JUnit 4使用org.junit.*包而JUnit 3.8使用的是junit.framework.*。當(dāng)然,為了向后兼容性起見,JUnit 4jar文件發(fā)行中加入了這兩種包。

  四、 繼承

  在中,測試類不必再擴(kuò)展junit.framework.TestCase;事實上,它們不必須擴(kuò)展任何內(nèi)容。但是,JUnit 4中使用的是注解。為了以一個測試用例方式執(zhí)行,一個JUnit 4類中至少需要一個@Test注解。例如,如果你僅使用@Before和@After注解而沒有至少提供一個@Test方法來編寫一個類,那么,當(dāng)你試圖執(zhí)行它時將得到一個錯誤:

java.lang.Exception: No runnable methods.

  五、 斷言(Assert)方法

  因為在JUnit 4中一個測試類并不繼承自TestCase(在JUnit 3.8中,這個類中定義了assertEquals()方法),所以你必須使用前綴語法(舉例來說,Assert.assertEquals())或者(由于JDK5.0)靜態(tài)地導(dǎo)入Assert類。這樣以來,你可以完全象以前一樣使用assertEquals方法(舉例來說,assertEquals())。

  另外,在JUnit 4中,還引入了兩個新的斷言方法,它們專門用于數(shù)組對象的比較。如果兩個數(shù)組包含的元素都相等,那么這兩個數(shù)組是相等的。

public static void assertEquals(String message, Object[] expecteds, Object[] actuals);
public static void assertEquals(Object[] expecteds, Object[] actuals);

  由于JDK 5.0的自動裝箱機(jī)制的出現(xiàn),原先的12個assertEquals方法全部去掉了。例如,原先JUnit 3.8中的assertEquals(long,long)方法在JUnit 4中要使用assertEquals(Object,Object)。對于assertEquals(byte,byte)、assertEquals(int,int)等也是這樣。這種改進(jìn)將有助于避免反模式。

  在JUnit 4中,新集成了一個assert關(guān)鍵字(見我們的例子中的divide()方法)。你可以象使用assertEquals方法一樣來使用它,因為它們都拋出相同的異常(java.lang.AssertionError)。JUnit 3.8的assertEquals將拋出一個junit.framework.AssertionFailedError。注意,當(dāng)使用assert時,你必須指定Java的"-ea"參數(shù);否則,斷言將被忽略。

  六、 預(yù)設(shè)環(huán)境(Fixture)

  Fixture是在測試期間初始化和釋放任何普通對象的方法。在JUnit 3.8中,你要使用setUp()來實現(xiàn)運行每一個測試前的初始化工作,然后使用tearDown()來進(jìn)行每個測試后的清理。這兩個方法在TestCase類中都得到重載,因此都被定義。注意,我在這個Setup方法使用的是Java5.0內(nèi)置的@Override注解-這個注解指示該方法聲明要重載在超類中的方法聲明。在JUnit 4中,則代之使用的是@Before和@After注解;而且,可以以任何命名(在我們的例子中是clearCalculator())來調(diào)用這些方法。在本文后面,我將更多地解釋這些注解。

  七、 測試

  JUnit 3.8通過分析它的簽名來識別一個測試方法:方法名必須以"test"為前綴,它必須返回void,而且它必須沒有任何參數(shù)(舉例來說,publicvoidtestDivide())。一個不遵循這個命名約定的測試方法將被框架簡單地忽略,而且不拋出任何異常(指示發(fā)生了一個錯誤)。
JUnit 4不使用與JUnit 3.8相同的約定。一個測試方法不必以'test'為前綴,但是要使用@Test注解。但是,正如在前一個框架中一樣,一個測試方法也必須返回void并且是無參數(shù)的。在JUnit 4中,可以在運行時刻控制這個要求,并且不符合要求的話會拋出一個異常:

java.lang.Exception: Method xxx should have no parameters
java.lang.Exception: Method xxx should be void

  @Test注解支持可選參數(shù)。它聲明一個測試方法應(yīng)該拋出一個異常。如果它不拋出或者如果它拋出一個與事先聲明的不同的異常,那么該測試失敗。在我們的例子中,一個整數(shù)被零除應(yīng)該引發(fā)一個ArithmeticException異常。

  八、 忽略一個測試

  記住,不能執(zhí)行多個方法。然而,如果你不想讓測試失敗的話,你可以僅僅忽略它。那么,在JUnit 3.8中,我們是如何實現(xiàn)臨時禁止一個測試的呢?方法是:通過注釋掉它或者改變命名約定,這樣測試運行機(jī)無法找到它。在我的例子中,我使用了方法名notReadyYetTestMultiply()。它沒有以"test"開頭,所以它不會被識別出來。現(xiàn)在的問題是,在成百上千的測試中間,你可能記不住重命名這個方法。

  在JUnit 4中,為了忽略一個測試,你可以注釋掉一個方法或者刪除@Test注解(你不能再改變命名約定,否則將拋出一個異常)。然而,該問題將保留:該運行機(jī)將不報告這樣一個測試,F(xiàn)在,你可以把@Ignore注解添加到@Test的前面或者后面。測試運行機(jī)將報告被忽略的測試的個數(shù),以及運行的測試的數(shù)目和運行失敗的測試數(shù)目。注意,@Ignore使用一個可選參數(shù)(一個String),如果你想記錄為什么一個測試被忽略的話。

  九、 運行測試

  在JUnit 3.8中,你可以選擇使用若干運行機(jī):文本型,AWT或者Swing。JUnit 4僅僅使用文本測試運行機(jī)。注意,JUnit 4不會顯示任何綠色條來通知你測試成功了。如果你想看到任何類型的綠色的話,那么你可能需要使用JUnit擴(kuò)展或一種集成了JUnit的IDE(例如IDEA或者Eclipse)。

  首先,我想使用老式但好用的junit.textui.TestRunner來運行該JUnit 3.8測試類(考慮到使用assert關(guān)鍵字,我使用了-ea參數(shù))。
java -ea junit.textui.TestRunner junit3.CalculatorTest

..F.E.
There was 1 error:
1) testDivide(junit3.CalculatorTest)java.lang.AssertionError
at junit3.CalculatorTest.testDivide(CalculatorTest.java:33)
There was 1 failure:
1) testSubtract(junit3.CalculatorTest)junit.framework.AssertionFailedError: expected:<9> but was:<8>
at junit3.CalculatorTest.testSubtract(CalculatorTest.java:27)
FAILURES!!!
Tests run: 4, Failures: 1, Errors: 1

  TestDivide產(chǎn)生一個錯誤,因為斷言確定了8/2不等于5。TestSubstract產(chǎn)生一個失敗,因為10-2應(yīng)該等于8,但是在這個實現(xiàn)中存在一個錯誤:它返回9。

  現(xiàn)在,我使用新的org.junit.runner.JUnitCore運行機(jī)來運行這兩個類。注意,它能執(zhí)行JUnit 4和JUnit 3.8測試,甚至是這二者的結(jié)合。

java -ea org.junit.runner.JUnitCore junit3.CalculatorTest

JUnit version 4.1

..E.E.
There were 2 failures:
1) testSubtract(junit3.CalculatorTest)
junit.framework.AssertionFailedError: expected:<9> but was:<8>
at junit.framework.Assert.fail(Assert.java:47)
2) testDivide(junit3.CalculatorTest)
java.lang.AssertionError
at junit3.CalculatorTest.testDivide(CalculatorTest.java:33)
FAILURES!!!
Tests run: 4, Failures: 2
***

java -ea org.junit.runner.JUnitCore JUnit 4.CalculatorTest

JUnit version 4.1
...E.EI
There were 2 failures:
1) subtract(JUnit 4.CalculatorTest)
java.lang.AssertionError: expected:<9> but was:<8>
at org.junit.Assert.fail(Assert.java:69)
2) divide(JUnit 4.CalculatorTest)
java.lang.AssertionError
at JUnit 4.CalculatorTest.divide(CalculatorTest.java:40)
FAILURES!!!
Tests run: 4, Failures: 2

  第一個非常明顯的區(qū)別是,JUnit版本號被顯示于控制臺中(4.1)。第二個區(qū)別是,JUnit 3.8區(qū)分失敗和錯誤;JUnit 4則僅使用失敗進(jìn)行簡化。一個新奇的地方是,字母"I",它顯示一個測試被忽略。

上一頁12345下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd