三、創(chuàng)建一個(gè)待測(cè)試的對(duì)象。
你要測(cè)試哪個(gè)類,那么你首先要?jiǎng)?chuàng)建一個(gè)該類的對(duì)象。正如上一篇文章中的代碼:
private static Calculator calculator = new Calculator();、
為了測(cè)試Calculator類,我們必須創(chuàng)建一個(gè)calculator對(duì)象。
四、測(cè)試方法的聲明
在測(cè)試類中,并不是每一個(gè)方法都是用于測(cè)試的,你必須使用“標(biāo)注”來(lái)明確表明哪些是測(cè)試方法。“標(biāo)注”也是JDK5的一個(gè)新特性,用在此處非常恰當(dāng)。我們可以看到,在某些方法的前有@Before、@Test、@Ignore等字樣,這些是標(biāo)注,以一個(gè)“@”作為開(kāi)頭。這些標(biāo)注都是JUnit4自定義的,熟練掌握這些標(biāo)注的含義非常重要。
五、編寫(xiě)一個(gè)簡(jiǎn)單的測(cè)試方法。
首先,你要在方法的前面使用@Test標(biāo)注,以表明這是一個(gè)測(cè)試方法。對(duì)于方法的聲明也有如下要求:名字可以隨便取,沒(méi)有任何限制,但是返回值必須為void,而且不能有任何參數(shù)。如果違反這些規(guī)定,會(huì)在運(yùn)行時(shí)拋出一個(gè)異常。至于方法內(nèi)該寫(xiě)些什么,那要看你需要測(cè)試些什么了。比如:
@Test
public void testAdd() ...{
calculator.add(2);
calculator.add(3);
assertEquals(5, calculator.getResult());
}
我們想測(cè)試一下“加法”功能時(shí)候正確,在測(cè)試方法中調(diào)用幾次add函數(shù),初始值為0,先加2,再加3,我們期待的結(jié)果應(yīng)該是5。如果終實(shí)際結(jié)果也是5,則說(shuō)明add方法是正確的,反之說(shuō)明它是錯(cuò)的。assertEquals(5, calculator.getResult());是來(lái)判斷期待結(jié)果和實(shí)際結(jié)果是否相等,第一個(gè)參數(shù)填寫(xiě)期待結(jié)果,第二個(gè)參數(shù)填寫(xiě)實(shí)際結(jié)果,也是通過(guò)計(jì)算得到的結(jié)果。這樣寫(xiě)好之后,JUnit會(huì)自動(dòng)進(jìn)行測(cè)試并把測(cè)試結(jié)果反饋給用戶。
六、忽略測(cè)試某些尚未完成的方法。
如果你在寫(xiě)程序前做了很好的規(guī)劃,那么哪些方法是什么功能都應(yīng)該實(shí)現(xiàn)定下來(lái)。因此,即使該方法尚未完成,他的具體功能也是確定的,這也意味著你可以為他編寫(xiě)測(cè)試用例。但是,如果你已經(jīng)把該方法的測(cè)試用例寫(xiě)完,但該方法尚未完成,那么測(cè)試的時(shí)候一定是“失敗”。這種失敗和真正的失敗是有區(qū)別的,因此JUnit提供了一種方法來(lái)區(qū)別他們,那是在這種測(cè)試函數(shù)的前面加上@Ignore標(biāo)注,這個(gè)標(biāo)注的含義是“某些方法尚未完成,暫不參與此次測(cè)試”。這樣的話測(cè)試結(jié)果會(huì)提示你有幾個(gè)測(cè)試被忽略,而不是失敗。一旦你完成了相應(yīng)函數(shù),只需要把@Ignore標(biāo)注刪去,可以進(jìn)行正常的測(cè)試。
七、Fixture(暫且翻譯為“固定代碼段”)
Fixture的含義是“在某些階段必然被調(diào)用的代碼”。比如我們上面的測(cè)試,由于只聲明了一個(gè)Calculator對(duì)象,他的初始值是0,但是測(cè)試完加法操作后,他的值不是0了;接下來(lái)測(cè)試減法操作,必然要考慮上次加法操作的結(jié)果。這是一個(gè)很糟糕的設(shè)計(jì)!我們非常希望每一個(gè)測(cè)試都是獨(dú)立的,相互之間沒(méi)有任何耦合度。因此,我們很有必要在執(zhí)行每一個(gè)測(cè)試之前,對(duì)Calculator對(duì)象進(jìn)行一個(gè)“復(fù)原”操作,以消除其他測(cè)試造成的影響。因此,“在任何一個(gè)測(cè)試執(zhí)行之前必須執(zhí)行的代碼”是一個(gè)Fixture,我們用@Before來(lái)標(biāo)注它,如前面例子所示:
@Before
public void setUp() throws Exception ...{
calculator.clear();
}
這里不在需要@Test標(biāo)注,因?yàn)檫@不是一個(gè)test,而是一個(gè)Fixture。同理,如果“在任何測(cè)試執(zhí)行之后需要進(jìn)行的收尾工作”也是一個(gè)Fixture,使用@After來(lái)標(biāo)注。由于本例比較簡(jiǎn)單,沒(méi)有用到此功能。