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

  接下來(lái)我們創(chuàng)建壹?測(cè)試類 CalculatorTest.java,代碼如下:
package net.oschina.bairrfhoinn.test;
import static org.junit.Assert.*;
import org.junit.Test;
import net.oschina.bairrfhoinn.main.Calculator;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Test
public void testAdd(){
calculator.add(7);
calculator.add(8);
assertEquals(15, calculator.getReuslt());
}
}
  首先,我們要在方法的前面使用@Test標(biāo)注,以表明這是壹?測(cè)試方法。對(duì)于方法的聲明也有如下要求:名字可以隨便取,沒(méi)有任何限制,但是返回值必須為void,而且不能有任何參數(shù)。如果違反這些規(guī)定,會(huì)在運(yùn)行時(shí)拋出壹?異常。至于方法內(nèi)該寫(xiě)些什么,那要看你需要測(cè)試些什么了。比如上述代碼中,我們想測(cè)試壹下add()方法的功能是否正確,在測(cè)試方法中調(diào)用幾次add函數(shù),初始值為0,先加7,再加8,我們期待的結(jié)果應(yīng)該是15。如果終實(shí)際結(jié)果也是15,則說(shuō)明add()方法是正確的,反之說(shuō)明它是錯(cuò)的。assertEquals(15, calculator.getResult());是用來(lái)判斷期待結(jié)果和實(shí)際結(jié)果是否相等,其中第壹?參數(shù)填寫(xiě)期待結(jié)果,第二?參數(shù)填寫(xiě)實(shí)際結(jié)果,也是通過(guò)計(jì)算得到的結(jié)果。這樣寫(xiě)好之后,JUnit 會(huì)自動(dòng)進(jìn)行測(cè)試并把測(cè)試結(jié)果反饋給用戶。
  如果想運(yùn)行它,可以在 eclipse 的資源管理器中選擇該類文件,然后點(diǎn)擊右鍵,選擇 Run As->JUnit Test 即可看到運(yùn)行結(jié)果如下圖所示:

  使用@Test 的屬性 Ignore 指定測(cè)試時(shí)跳過(guò)這?方法
  如果你在寫(xiě)程序前做了很好的規(guī)劃,那么哪些方法是什么功能都應(yīng)該實(shí)現(xiàn)并且確定下來(lái)。因此,即使該方法尚未完成,他的具體功能也是確定的,這也意味著你可以為他編寫(xiě)測(cè)試用例。但是,如果你已經(jīng)把該方法的測(cè)試用例寫(xiě)完,但該方法尚未完成,那么測(cè)試的時(shí)候無(wú)疑是“失敗”。這種失敗和真正的失敗是有區(qū)別的,因此 JUnit 提供了壹種方法來(lái)區(qū)別他們,那是在這種測(cè)試函數(shù)的前面加上 @Ignore 標(biāo)注,這個(gè)標(biāo)注的含義是“某些方法尚未完成,暫不參與此次測(cè)試”。這樣的話測(cè)試結(jié)果會(huì)提示你有幾?測(cè)試被忽略,而不是失敗。壹旦你完成了相應(yīng)函數(shù),只需要把@Ignore標(biāo)注刪去,可以進(jìn)行正常的測(cè)試。
  比如說(shuō)上面的測(cè)試類 Calculator.java 中,假設(shè)我們的 Calculator 類的 multiply() 方法沒(méi)有實(shí)現(xiàn),我們可以在測(cè)試類 CalculatorTest 中先寫(xiě)如下測(cè)試代碼:
package net.oschina.bairrfhoinn.test;
import static org.junit.Assert.*;
import org.junit.Ignore;
import org.junit.Test;
import net.oschina.bairrfhoinn.main.Calculator;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
... //此處代碼省略
@Ignore("method square() not implemented, please test this later...")
@Test
public void testSquare(){
calculator.square(3);
assertEquals(9, calculator.getReuslt());
}
}
  我們?cè)龠\(yùn)行壹次測(cè)試,會(huì)看到如下結(jié)果,從圖中可以很明顯的看出,方法testSquare() 上的 @Ignore 注解已經(jīng)生效了,運(yùn)行時(shí)直接跳過(guò)了它,而方法testAdd()仍然正常的運(yùn)行并通過(guò)了測(cè)試。

  使用注解 @Before 和 @After 來(lái)完成前置工作和后置工作
  前置工作通常是指我們的測(cè)試方法在運(yùn)行之前需要做的壹些準(zhǔn)備工作,如數(shù)據(jù)庫(kù)的連接、文件的加載、輸入數(shù)據(jù)的準(zhǔn)備等需要在運(yùn)行測(cè)試方法之前做的事情,都屬于前置工作;類似的,后置工作則是指測(cè)試方法在運(yùn)行之后的壹些要做的事情,如釋放數(shù)據(jù)庫(kù)連接、輸入輸出流的關(guān)閉等;比如我們上面的測(cè)試,由于只聲明了壹? Calculator 對(duì)象,他的初始值是0,但是測(cè)試完加法操作后,他的值不是0了;接下來(lái)測(cè)試減法操作,必然要考慮上次加法操作的結(jié)果。這是壹?很糟糕的設(shè)計(jì)!我們非常希望每壹?測(cè)試方法都是獨(dú)立的,相互之間沒(méi)有任何耦合度。因此,我們很有必要在執(zhí)行每壹?測(cè)試方法之前,對(duì)Calculator對(duì)象進(jìn)行壹?“復(fù)原”操作,以消除其他測(cè)試造成的影響。因此,“在任何壹?測(cè)試方法執(zhí)行之前必須執(zhí)行的代碼”是壹?前置工作,我們用注解 @Before 來(lái)標(biāo)注它,如下例子所示:
package net.oschina.bairrfhoinn.test;
...
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {
...//這里省略部分代碼
@Before
public void setUp() throws Exception {
calculator.clear();
}
@After
public void tearDown() throws Exception {
System.out.println("will do sth here...");
}
...//這里省略部分代碼
}

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