您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
使用JUnit進(jìn)行Java代碼的單元測試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/12/13 14:17:12 ] 推薦標(biāo)簽:

  另外要說的是,注解 @Before 是定義在 org.junit.Before 這?類中的,因此使用時(shí)需要將其引入我們的代碼中。這樣做了之后,每次我們運(yùn)行測試方法時(shí),JUnit 都會(huì)先運(yùn)行 setUp() 方法將 result 的值清零。不過要注意的是,這里不再需要 @Test 注解,因?yàn)檫@并不是壹? test,只是壹?前置工作。同理,如果“在任何測試執(zhí)行之后需要進(jìn)行的收尾工作,我們應(yīng)該使用 @After 來標(biāo)注,方法與它類似。由于本例比較簡單,不需要用到此功能,所以我們只是簡單了給它添加了壹? tearDown() 方法并在收尾時(shí)打印壹句話到控制臺(tái),并且使用 @After 來注解這?方法。
  使用@BeforeClass 和 @AfterClass 來完成只需要執(zhí)行壹次的前置工作和后置工作
  上面我們提到了兩?注解 @Before 和 @After ,我們來看看他們是否適合完成如下功能:有壹?類負(fù)責(zé)對(duì)大文件(超過500 MB)進(jìn)行讀寫,他的每壹?方法都是對(duì)文件進(jìn)行操作。換句話說,在調(diào)用每壹?方法之前,我們都要打開壹?大文件并讀入文件內(nèi)容,這是壹?非常耗費(fèi)時(shí)的操作。如果我們使用 @Before 和 @After ,那么每次測試都要讀取壹次文件,效率及其低下。所以我們希望的是,在所有測試壹開始讀壹次文件,所有測試結(jié)束之后釋放文件,而不是每次測試都讀文件。JUnit的作者顯然也考慮到了這個(gè)問題,它給出了@BeforeClass 和 @AfterClass 兩?注解來幫我們實(shí)現(xiàn)這個(gè)功能。從名字上可以看出,用這兩?注解標(biāo)注的函數(shù),只在測試用例初始化時(shí)執(zhí)行 @BeforeClass 方法,當(dāng)所有測試執(zhí)行完畢之后,執(zhí)行 @AfterClass 進(jìn)行收尾工作。在這里要注意壹下,每?測試類只能有壹?方法被標(biāo)注為 @BeforeClass 或 @AfterClass,而且該方法必須是 public static 類型的。
  使用@Test 的屬性 timeout 來完成測試,以檢測代碼中的死循環(huán)
  現(xiàn)在假設(shè)我們的 Calculator 類中的 square() 方法是?死循環(huán),那應(yīng)該怎么辦呢,比如說像下面這樣:
public void square(int n){
for(;;){}
}
  如果測試的時(shí)候遇到死循環(huán),你的臉上不會(huì)露出笑容的。因此,對(duì)于那些邏輯很復(fù)雜,循環(huán)嵌套比較深的、有可能出現(xiàn)死循環(huán)的程序,因此壹定要采取壹些預(yù)防措施。測試是壹?很好的解決方案。我們給這些測試函數(shù)設(shè)定壹?預(yù)期的執(zhí)行時(shí)間,超過了這壹時(shí)間,他們會(huì)被系統(tǒng)強(qiáng)行終止,并且系統(tǒng)還會(huì)向你匯報(bào)該函數(shù)結(jié)束的原因是因?yàn)槌瑫r(shí),這樣你可以發(fā)現(xiàn)這些 Bug 了。要實(shí)現(xiàn)這壹功能,只需要給 @Test 標(biāo)注加壹?參數(shù)timeout即可,代碼如下:
@Test(timeout=2000L)
public void testSquare() {
calculator.square(3);
assertEquals(9, calculator.getReuslt());
}
  timeout參數(shù)表明了你預(yù)計(jì)該方法運(yùn)行的時(shí)長,單位為毫秒,因此2000代表2秒,F(xiàn)在我們讓這?測試方法運(yùn)行壹下,看看失敗時(shí)是什么效果。

  使用@Test 的屬性expected來監(jiān)控測試方法中可能會(huì)拋出的某些異常
  JAVA中的異常處理也是壹?重點(diǎn),因此你經(jīng)常會(huì)編寫壹些需要拋出異常的函數(shù)。如果你覺得壹?函數(shù)應(yīng)該拋出異常,但是它沒拋出,這算不算 Bug 呢?這當(dāng)然是Bug,JUnit 也考慮到了這壹點(diǎn),并且可以幫助我們找到這種 Bug。例如,我們寫的計(jì)算器類有除法功能,如果除數(shù)是壹?0,那么必然要拋出“除0異常”。因此,我們很有必要對(duì)這些進(jìn)行測試。代碼如下:
@Test(expected=java.lang.ArithmeticException.class)
public void testDivide(){
calculator.divide(0);
}
  如上述代碼所示,我們需要使用@Test注解中的expected屬性,將我們要檢驗(yàn)的異常(這里是 java.lang.ArithmeticException)傳遞給他,這樣 JUnit 框架能自動(dòng)幫我們檢測是否拋出了我們指定的異常。
  指定 JUnit 運(yùn)行測試用例時(shí)的 Runner
  大家有沒有想過這?問題,當(dāng)你把測試代碼提交給JUnit框架后,框架是如何來運(yùn)行你的代碼的呢?答案是Runner。在JUnit中有很多個(gè)Runner,他們負(fù)責(zé)調(diào)用你的測試代碼,每壹?Runner都有其各自的特殊功能,你要根據(jù)需要選擇不同的Runner來運(yùn)行你的測試代碼?赡苣銜(huì)覺得奇怪,前面我們寫了那么多測試,并沒有明確指定壹?Runner啊?這是因?yàn)镴Unit中有壹?默認(rèn)的Runner,如果你沒有指定,那么系統(tǒng)會(huì)自動(dòng)使用默認(rèn)Runner來運(yùn)行你的代碼。換句話說,下面兩段代碼含義是完全壹樣的:
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class CalculatorTest {
...//省略此處代碼
}
//用了系統(tǒng)默認(rèn)的JUnit4.class,運(yùn)行效果完全壹樣
public class CalculatorTest {
...//省略此處代碼
}

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