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

JUnit的高級(jí)特性

在示例測(cè)試實(shí)例中,你已經(jīng)同時(shí)運(yùn)行了所有的測(cè)試。在現(xiàn)實(shí)中,你可能希望運(yùn)行一個(gè)給定的測(cè)試方法來詢問你正編寫的實(shí)施方法,所以你需要定義一組要運(yùn)行的測(cè)試。這是框架的junit.framework.TestSuite類的目的,這個(gè)類其實(shí)只是一個(gè)容器,你可以向其中添加一系列測(cè)試。如果你正在進(jìn)行toString()實(shí)施,并希望運(yùn)行相應(yīng)的測(cè)試方法,那么你可以通過重寫測(cè)試的suite()方法來通知運(yùn)行器,方法如下:

public static Test suite() {

  TestSuite suite= new TestSuite();
  suite.addTest(new IsoDateTest
("testToString"));
  return suite;
}
 

在此方法中,你用具體示例說明了一個(gè)TestSuite對(duì)象,并向其中添加了測(cè)試。為了在方法級(jí)定義測(cè)試,你可以利用構(gòu)造器將方法名作為參數(shù)使測(cè)試類實(shí)例化。此構(gòu)造器可按如下方法實(shí)施:

public IsoDateTest(String name) {
  super(name);
}
 

將上面的構(gòu)造器和方法添加到IsoDateTest類(還需要引入junit.framework.Test和junit.framework.TestSuite),并在終端上輸入:

 
$ javac *.java
$ java junit.textui.TestRunner IsoDateTest
.
Time: 0,31
OK (1 test)
 

注意,在添加到測(cè)試包中的測(cè)試方法中,只運(yùn)行了一個(gè)測(cè)試方法,即toString()方法。

你也可以利用圖形界面,通過在圖3所示的Test Hierarchy面板中選擇測(cè)試方法來運(yùn)行一個(gè)給定的測(cè)試方法。但是,要注意當(dāng)整個(gè)測(cè)試包被運(yùn)行一次后,該面板將被填滿。

當(dāng)你希望將一個(gè)測(cè)試實(shí)例中的所有測(cè)試方法添加到一個(gè)TestSuite對(duì)象中時(shí),可以使用一個(gè)專用構(gòu)造器,該構(gòu)造器將此測(cè)試實(shí)例的類對(duì)象作為參數(shù)。例如,你可以使用IsoDateTest類實(shí)施suite()方法,方法如下:

public static Test suite() {
  return new TestSuite(IsoDateTest.class);
}
 

還有一些情況,你可能希望運(yùn)行一組由其他測(cè)試(如在工程發(fā)布之前的所有測(cè)試)組成的測(cè)試。在這種情況下,你必須編寫一個(gè)實(shí)施suite()方法的類,以建立希望運(yùn)行的測(cè)試包。例如,假定你已經(jīng)編寫了測(cè)試類Atest和Btest。為了定義那些包含了類ATest中的所有測(cè)試和在BTest中定義的測(cè)試包的集合,可以編寫下面的類:

import junit.framework.*;

/**
 * TestSuite that runs all tests.
 */
public class AllTests {

  public static Test suite() {
     TestSuite suite= new TestSuite("All Tests");
     suite.addTestSuite(ATest.class);
     suite.addTest(BTest.suite());
     return suite;
  }
}
 

你完全可以像運(yùn)行單個(gè)測(cè)試實(shí)例那樣運(yùn)行這個(gè)測(cè)試包。注意,如果一個(gè)測(cè)試在一個(gè)套件中添加了兩次,那么運(yùn)行器將運(yùn)行它兩次(測(cè)試包和運(yùn)行器都不會(huì)檢查該測(cè)試是否是的)。為了了解實(shí)際的測(cè)試包的實(shí)施,應(yīng)當(dāng)研究Junit本身的測(cè)試包。這些類的源代碼存在于JUnit安裝的junit/test目錄下。

將一個(gè)main()方法添加到一個(gè)測(cè)試或一個(gè)測(cè)試包中有時(shí)是非常方便的,因此可以在不使用運(yùn)行器的情況下啟動(dòng)測(cè)試。例如,要將AllTests測(cè)試包作為一個(gè)標(biāo)準(zhǔn)的Java程序啟動(dòng),可以將下面的main()方法添加到類中:

public static void main(String[] args) {
  junit.textui.TestRunner.run(suite());
}
 

現(xiàn)在可以通過輸入java AllTests來啟動(dòng)這個(gè)測(cè)試包。

JUnit框架還提供了一種有效利用代碼的方法,即將資源集合到被稱為fixture的對(duì)象集中。例如,該示例測(cè)試實(shí)例利用兩個(gè)叫作epoch和eon的參考日期。將這些日期重新編譯到每個(gè)方法測(cè)試中只是浪費(fèi)時(shí)間(而且還可能出現(xiàn)錯(cuò)誤)。你可以用fixture重新編寫測(cè)試,如清單2所示。

你定義了兩個(gè)參考日期,作為測(cè)試類的段,并將它們編譯到一個(gè)setUp()方法中。這一方法在每個(gè)測(cè)試方法之前被調(diào)用。與其對(duì)應(yīng)的方法是tearDown()方法,它將在每個(gè)測(cè)試方法運(yùn)行之后清除所有的資源(在這個(gè)實(shí)施中,該方法事實(shí)上什么也沒做,因?yàn)槔占鳛槲覀兺瓿闪诉@項(xiàng)工作),F(xiàn)在編譯這個(gè)測(cè)試實(shí)例(其源代碼應(yīng)當(dāng)放在JUnit的安裝目錄中)并運(yùn)行它:

$ javac *.java
$ java junit.textui.TestRunner IsoDateTest2
.setUp()
testIsoDate()
tearDown()
.setUp()
testToString()
tearDown()

Time: 0,373

OK (2 tests)
 

注意:在該測(cè)試實(shí)例中建立了參考日期,因此在任何測(cè)試方法中修改這些日期都不會(huì)對(duì)其他測(cè)試產(chǎn)生不利影響。你可以將代碼放到這兩個(gè)方法中,以建立和釋放每個(gè)測(cè)試所需要的資源(如數(shù)據(jù)庫(kù)連接)。

JUnit發(fā)布版還提供了擴(kuò)展模式(在包junit.extensions中),即test decor-ators,以提供像重復(fù)運(yùn)行一個(gè)給定的測(cè)試這樣的新功能。它還提供了一個(gè)TestSuite,以方便你在獨(dú)立的線程中同時(shí)運(yùn)行所有測(cè)試,并在所有線程中的測(cè)試都完成時(shí)停止。

利用Ant使測(cè)試自動(dòng)化

如前面所述,測(cè)試運(yùn)行器是非常原始的。如果你正在運(yùn)行Ant來編譯你的工程,那么編譯文件是運(yùn)行單元測(cè)試的好方法。(關(guān)于Ant的介紹,請(qǐng)參考我的文章《Ant簡(jiǎn)介》(Starting with Ant),發(fā)表于Oracle雜志2002年11/12月號(hào)中)。

假設(shè)你的源文件在src目錄中,所生成的類在tmp目錄中,并且junit.jar庫(kù)位于工程的libdirectory目錄中,那么你可以編譯Java源文件,并使用清單3中所示的編譯文件(在工程的根目錄中)運(yùn)行單元測(cè)試。

這個(gè)編譯文件的核心是運(yùn)行單元測(cè)試的測(cè)試目標(biāo)。運(yùn)行這些測(cè)試是這個(gè)目標(biāo)junit的任務(wù)。為了運(yùn)行這一可選任務(wù),必須首先將junit.jar庫(kù)放到Ant安裝目錄下的lib目錄中,然后下載并安裝同一目錄中的Ant可選任務(wù)庫(kù)。清單3中的示例嵌套了一個(gè)classpath類,它包括JUnit庫(kù)和工程的類;示例中還嵌套了一個(gè)batchtest元素,它利用一個(gè)選擇適當(dāng)源文件的fileset元素定義了將要運(yùn)行的測(cè)試。這個(gè)任務(wù)還包括haltonfilure和haltonerror屬性,它們告訴Ant在遇到一個(gè)失敗或錯(cuò)誤時(shí)是否應(yīng)當(dāng)停止。如果將它們的值設(shè)置為"真",那么Ant在遇到第一個(gè)失敗或錯(cuò)誤時(shí)將會(huì)停止,編譯將會(huì)失。@然,這表示在運(yùn)行測(cè)試過程中存在有問題)。另一方面,如果將它們的值設(shè)置為"假",其結(jié)果不是非常明確了(即使測(cè)試失敗,編譯也會(huì)成功),但所有測(cè)試仍將運(yùn)行。printsummary屬性指示Ant是否顯示運(yùn)行測(cè)試的輸出。數(shù)值withOutAndErr可以在開發(fā)測(cè)試時(shí)方便地告訴Ant顯示標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出。數(shù)值off表示不顯示任何內(nèi)容,而on只顯示測(cè)試報(bào)告(沒有測(cè)試類的輸出)。junit任務(wù)具有很多屬性,詳細(xì)內(nèi)容請(qǐng)參考Ant的文檔。

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