我們可以看到,采用Annotation的JUnit已經(jīng)不會霸道的要求你必須繼承自TestCase了,而且測試方法也不必以test開頭了,只要以@Test元數(shù)據(jù)來描述即可。
從上面的例子可以看到在JUnit 4中還引入了一些其他的元數(shù)據(jù),下面一一介紹:
@Before:
使用了該元數(shù)據(jù)的方法在每個測試方法執(zhí)行之前都要執(zhí)行一次。
@After:
使用了該元數(shù)據(jù)的方法在每個測試方法執(zhí)行之后要執(zhí)行一次。
注意:@Before和@After標示的方法只能各有一個。這個相當于取代了JUnit以前版本中的setUp和tearDown方法,當然你還可以繼續(xù)叫這個名字,不過JUnit不會霸道的要求你這么做了。
@Test(expected=*.class)
在JUnit4.0之前,對錯誤的測試,我們只能通過fail來產(chǎn)生一個錯誤,并在try塊里面assertTrue(true)來測試,F(xiàn)在,通過@Test元數(shù)據(jù)中的expected屬性。expected屬性的值是一個異常的類型
@Test(timeout=xxx):
該元數(shù)據(jù)傳入了一個時間(毫秒)給測試方法,
如果測試方法在制定的時間之內(nèi)沒有運行完,則測試也失敗。
@ignore:
該元數(shù)據(jù)標記的測試方法在測試中會被忽略。當測試的方法還沒有實現(xiàn),或者測試的方法已經(jīng)過時,或者在某種條件下才能測試該方法(比如需要一個數(shù)據(jù)庫聯(lián)接,而在本地測試的時候,數(shù)據(jù)庫并沒有連接),那么使用該標簽來標示這個方法。同時,你可以為該標簽傳遞一個String的參數(shù),來表明為什么會忽略這個測試方法。比如:@lgnore(“該方法還沒有實現(xiàn)”),在執(zhí)行的時候,僅會報告該方法沒有實現(xiàn),而不會運行測試方法。
在Eclipse中使用JUnit4進行單元測試(初級篇)
我們在編寫大型程序的時候,需要寫成千上萬個方法或函數(shù),這些函數(shù)的功能可能很強大,但我們在程序中只用到該函數(shù)的一小部分功能,并且經(jīng)過調(diào)試可以確定,這一小部分功能是正確的。但是,我們同時應(yīng)該確保每一個函數(shù)都完全正確,因為如果我們今后如果對程序進行擴展,用到了某個函數(shù)的其他功能,而這個功能有bug的話,那是一件非常郁悶的事情。所以說,每編寫完一個函數(shù)之后,都應(yīng)該對這個函數(shù)的方方面面進行測試,這樣的測試我們稱之為單元測試。傳統(tǒng)的編程方式,進行單元測試是一件很麻煩的事情,你要重新寫另外一個程序,在該程序中調(diào)用你需要測試的方法,并且仔細觀察運行結(jié)果,看看是否有錯。正因為如此麻煩,所以程序員們編寫單元測試的熱情不是很高。于是有一個牛人推出了單元測試包,大大簡化了進行單元測試所要做的工作,這是JUnit4。本文簡要介紹一下在Eclipse3.2中使用JUnit4進行單元測試的方法。
首先,我們來一個傻瓜式速成教程,不要問為什么,F(xiàn)ollow Me,先來體驗一下單元測試的快感!
首先新建一個項目叫JUnit_Test,我們編寫一個Calculator類,這是一個能夠簡單實現(xiàn)加減乘除、平方、開方的計算器類,然后對這些功能進行單元測試。這個類并不是很完美,我們故意保留了一些Bug用于演示,這些Bug在注釋中都有說明。該類代碼如下:
package andycpp;
public class Calculator ...{
private static int result; // 靜態(tài)變量,用于存儲運行結(jié)果
public void add(int n) ...{
result = result + n;
}
public void substract(int n) ...{
result = result - 1; //Bug: 正確的應(yīng)該是 result =result-n
}
public void multiply(int n) ...{
} // 此方法尚未寫好
public void divide(int n) ...{
result = result / n;
}
public void square(int n) ...{
result = n * n;
}
public void squareRoot(int n) ...{
for (; ;) ; //Bug : 死循環(huán)
}
public void clear() ...{ // 將結(jié)果清零
result = 0;
}
public int getResult() ...{
return result;
}
}