您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
循序漸進(jìn)學(xué)習(xí)JUnit
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2012/11/29 14:45:03 ] 推薦標(biāo)簽:

測(cè)試方法的主體通過(guò)驗(yàn)證assertion(斷言)對(duì)被測(cè)方法進(jìn)行詢問(wèn)。例如,在toString()實(shí)施的測(cè)試方法中,你希望確認(rèn)該方法已經(jīng)對(duì)時(shí)間的設(shè)定進(jìn)行了很好的說(shuō)明(對(duì)于UNIX系統(tǒng)來(lái)說(shuō),初問(wèn)世的時(shí)間為1970年1月1日的午夜)。要實(shí)施assertion,你可以使用Junit框架提供的assertion方法。這些方法在該框架的junit.framework.Assert類中被實(shí)施,并且可以在你的測(cè)試中被訪問(wèn),這是因?yàn)锳ssert是TestCase的父類。這些方法可與Java中的關(guān)鍵字assert(是在J2EE 1.4中新出現(xiàn)的)相比。一些assertion方法可以檢查原始類型(如布爾型、整型等)之間或?qū)ο笾g是否相等(利用equals()方法檢查兩個(gè)對(duì)象是否相等)。其他assertion方法檢查兩個(gè)對(duì)象是否相同、一個(gè)對(duì)象是否為"空"或"非空",以及一個(gè)布爾值(通常由一個(gè)表達(dá)式生成)是"真"還是"假"。在表 1中對(duì)這些方法進(jìn)行了總結(jié)。

對(duì)于那些采用浮點(diǎn)類型或雙精度類型參數(shù)的assertion,存在一個(gè)第三種方法,即采用一個(gè)delta值作為參數(shù)進(jìn)行比較。另外還要注意,assertEquals()和assertSame()方法一般不會(huì)產(chǎn)生相同的結(jié)果。(兩個(gè)具有相同值的字符串可以不相同,因?yàn)樗鼈兪莾蓚(gè)具有不同內(nèi)存地址的不同對(duì)象。)因此,assertEquals()將會(huì)驗(yàn)證assertion的有效性,而assertSame()則不會(huì)。注意,對(duì)于表 1 中的每個(gè)assertion方法,你還有一種選擇,是引入另一個(gè)參數(shù),如果assertion失敗,該參數(shù)會(huì)給出一條解釋性消息。例如,assertEquals(int 期望值, int 實(shí)際值)可以與一個(gè)諸如assertEquals(字符串消息,int期望值,int實(shí)際值)的消息一起使用。

當(dāng)一個(gè)assertion失敗時(shí),該assertion方法會(huì)拋出一個(gè)AssertFailedError或ComparisonFailure。AssertionFailedError由java.lang.Error繼承而來(lái),因此你不必在測(cè)試方法的throws語(yǔ)句中對(duì)其進(jìn)行聲明。而ComparisonFailure由AssertionFailedError繼承而來(lái),因此你也不必對(duì)其進(jìn)行聲明。因?yàn)楫?dāng)一個(gè)assertion失敗時(shí)會(huì)在測(cè)試方法中拋出一個(gè)錯(cuò)誤,所以后面的assertion將不會(huì)繼續(xù)運(yùn)行。框架捕捉到這些錯(cuò)誤并認(rèn)定該測(cè)試已經(jīng)失敗后,會(huì)打印出一條說(shuō)明錯(cuò)誤的消息。這個(gè)消息由assertion生成,并且被傳遞到assertion方法(如果有的話)。

現(xiàn)在將下面一行語(yǔ)句添加到testIsoDate()方法的末尾:

assertEquals("This is a test",1,2);
 

現(xiàn)在編譯并運(yùn)行測(cè)試:

$ javac *.java
$ java junit.textui.TestRunner IsoDateTest
.F.
Time: 0,348
There was 1 failure:
1) testIsoDate(IsoDateTest)junit.framework
.AssertionFailedError: This is a test expected:<1> but was:<2>
      at IsoDateTest.testIsoDate
      (IsoDateTest.java:29)

FAILURES!!!
Tests run: 2,  Failures: 1,  Errors: 0
 

JUnit為每個(gè)已處理的測(cè)試打印一個(gè)點(diǎn),顯示字母"F"來(lái)表示失敗,并在assertion失敗時(shí)顯示一條消息。此消息由你發(fā)送到assertion方法的注釋和assertion的結(jié)果組成(自動(dòng)生成)。從這里可以看出assertion方法的參數(shù)順序?qū)τ谏傻南⒎浅V匾。第一個(gè)參數(shù)是期望值,而第二個(gè)參數(shù)則是實(shí)際值。

如果在測(cè)試方法中出現(xiàn)了某種錯(cuò)誤(例如,拋出了一個(gè)異常),該工具會(huì)將其顯示為一個(gè)錯(cuò)誤(而不是由assertion失敗而產(chǎn)生的一個(gè)"失敗"),F(xiàn)在對(duì)IsoDateTest類進(jìn)行修改,以將前面增加的一行語(yǔ)句用以下語(yǔ)句代替:

throw new Exception("This is a test");
 

然后編譯并運(yùn)行測(cè)試:

$ javac *.java
$ java junit.textui.TestRunner IsoDateTest
.E.
Time: 0,284
There was 1 error:
1) testIsoDate(IsoDateTest)java.lang.
   Exception: This is a test at IsoDate
   Test.testIsoDate(IsoDateTest.java:30)

FAILURES!!!
Tests run: 2,  Failures: 0,  Errors: 1
 

該工具將該異常顯示為一個(gè)錯(cuò)誤。因此,一個(gè)錯(cuò)誤表示一個(gè)錯(cuò)誤的測(cè)試方法,而不是表示一個(gè)錯(cuò)誤的測(cè)試實(shí)施。

Assert類還包括一個(gè)fail()方法(該版本帶有解釋性消息),該方法將通過(guò)拋出AssertionFailedError來(lái)中斷正在運(yùn)行的測(cè)試。當(dāng)你希望一個(gè)測(cè)試失敗而不會(huì)調(diào)用一個(gè)判定方法時(shí),fail()方法是非常有用的。例如,如果一段代碼應(yīng)當(dāng)拋出一個(gè)異常而未拋出,那么可以調(diào)用fail()方法使該測(cè)試失敗,方法如下:

public void testIndexOutOfBounds() {
  try {
       ArrayList list=new ArrayList();
       list.get(0);
       fail("IndexOutOfBoundsException  
           not thrown");
  } catch(IndexOutOfBoundsException e) {}
}
 

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