您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
循序漸進學習JUnit
作者:網(wǎng)絡轉載 發(fā)布時間:[ 2012/11/29 14:45:03 ] 推薦標簽:

JUnit的高級特性

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

public static Test suite() {

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

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

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

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

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

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

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

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

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

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

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;
  }
}
 

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

將一個main()方法添加到一個測試或一個測試包中有時是非常方便的,因此可以在不使用運行器的情況下啟動測試。例如,要將AllTests測試包作為一個標準的Java程序啟動,可以將下面的main()方法添加到類中:

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

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

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

你定義了兩個參考日期,作為測試類的段,并將它們編譯到一個setUp()方法中。這一方法在每個測試方法之前被調用。與其對應的方法是tearDown()方法,它將在每個測試方法運行之后清除所有的資源(在這個實施中,該方法事實上什么也沒做,因為垃圾收集器為我們完成了這項工作),F(xiàn)在編譯這個測試實例(其源代碼應當放在JUnit的安裝目錄中)并運行它:

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

Time: 0,373

OK (2 tests)
 

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

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

利用Ant使測試自動化

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

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

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

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