??? 看了幾篇文章之后,對(duì)JUnit4已經(jīng)有了基本的概念了。其實(shí)很多特性,testNg都已經(jīng)實(shí)現(xiàn)了,挺討厭testNg的xml文件,不過testNg的靈活性還是強(qiáng)大,對(duì)于大面積的組件測(cè)試比較適合。
??? JUnit 4應(yīng)該說是使用新的架構(gòu)寫的,使用了很多java5的新特性。
??? 一個(gè)最關(guān)鍵的改變,測(cè)試類,可以不用繼承那該死的TestCase了.測(cè)試類,可以更加靈活,方法的定義不需要在前面增加test了。
??? 對(duì)于測(cè)試類來說,只需要做以下簡(jiǎn)單的動(dòng)作:
??? 增加一個(gè)@Test,用于標(biāo)注相應(yīng)的測(cè)試方法。使用Assert類,來進(jìn)行斷言。
???
import org.junit.Assert; public class AdditionTest { ? private int x =
1; ? private int y =
1; ? @Test public
void addition() { ??? int z = x +
y; ???
Assert.assertEquals(2, z); ? } } |
當(dāng)然可以使用java 5的static import 功能
import static org.junit.Assert.*; public class AdditionTest { ? private int x =
1; ? private int y =
1; ? @Test public
void addition() { ??? int z = x +
y; ???
assertEquals(2, z); ? } } |
對(duì)于setUp 和tearDown來說,以后可以不用再繼承這兩個(gè)方法了。可以使用自定義的方法,只需要在前面增加@Before 和@After 注釋即可。
@Before protected void initialize() { ???
System.setErr(new PrintStream(new ByteArrayOutputStream())); ??? inputDir =
new File("data"); ??? inputDir =
new File(inputDir, "xslt"); ??? inputDir =
new File(inputDir, "input"); ??????? } |
@After protected void disposeDocument() { ? doc = null; ?
System.gc();?? } |
并且可以注釋多個(gè)方法。
??? 當(dāng)然JUnit4 也引入了一個(gè) JUnit 3 中沒有的新特性:類范圍的 setUp() 和 tearDown() 方法。任何用 @BeforeClass 注釋的方法都將在該類中的測(cè)試方法運(yùn)行之前剛好運(yùn)行一次,而任何用 @AfterClass 注釋的方法都將在該類中的所有測(cè)試都運(yùn)行之后剛好運(yùn)行一次。
??? 例 如,假設(shè)類中的每個(gè)測(cè)試都使用一個(gè)數(shù)據(jù)庫(kù)連接、一個(gè)網(wǎng)絡(luò)連接、一個(gè)非常大的數(shù)據(jù)結(jié)構(gòu),或者還有一些對(duì)于初始化和事情安排來說比較昂貴的其他資源。不要在每 個(gè)測(cè)試之前都重新創(chuàng)建它,您可以創(chuàng)建它一次,并還原它一次。該方法將使得有些測(cè)試案例運(yùn)行起來快得多。
// This class tests a lot of error conditions, which // Xalan annoyingly logs to System.err. This hides
System.err // before each test and restores it after each test. private PrintStream systemErr; @BeforeClass protected void redirectStderr() { ??? systemErr =
System.err; // Hold on to the original value ???
System.setErr(new PrintStream(new ByteArrayOutputStream())); } @AfterClass protected void tearDown() { ??? // restore
the original value ???
System.setErr(systemErr); } |
??? 異常測(cè)試是 JUnit 4 中的最大改進(jìn)。舊式的異常測(cè)試是在拋出異常的代碼中放入 try 塊,然后在 try 塊的末尾加入一個(gè) fail() 語(yǔ)句。
該方法不僅難看,而且試圖挑戰(zhàn)代碼覆蓋工具,因?yàn)椴还軠y(cè)試是通過還是失敗,總有一些代碼不被執(zhí)行。在 JUnit 4 中,您現(xiàn)在可以編寫拋出異常的代碼,并使用注釋來聲明該異常是預(yù)期的:
@Test(expected=ArithmeticException.class) ? public void
divideByZero() { ??? int n = 2 /
0; } |
??? 如果該異常沒有拋出(或者拋出了一個(gè)不同的異常),那么測(cè)試就將失敗。但是如果您想要測(cè)試異常的詳細(xì)消息或其他屬性,則仍然需要使用舊式的 try-catch 樣式。
??? 測(cè)試性能 是單元測(cè)試最為痛苦的方面之一。JUnit 4 沒有完全解決這個(gè)問題,但是它對(duì)這個(gè)問題有所幫助。測(cè)試可以用一個(gè)超時(shí)參數(shù)來注釋。如果測(cè)試運(yùn)行的時(shí)間超過指定的毫秒數(shù),則測(cè)試失敗。
@Test(timeout=500) public void
retrieveAllElementsInDocument() { ???
doc.query("http://*"); } |
基本的特性就這么多,這些功能其實(shí)都可以在testNg中找到。不過JUnit還是不錯(cuò)的,對(duì)于單元測(cè)試來說,這是首選的。
當(dāng)然為了兼容性,為了使 JUnit 4 測(cè)試可以運(yùn)行在 JUnit 3 環(huán)境中,可以將它們包裝在 JUnit4TestAdapter 中。將下面的方法添加到您的 JUnit 4 測(cè)試類中應(yīng)該就足夠了:
public static junit.framework.Test suite() { ? return new
JUnit4TestAdapter(AssertionTest.class);???
} |