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

JUnit的高級特性

在示例測試實例中,你已經同時運行了所有的測試。在現(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()方法的類,以建立希望運行的測試包。例如,假定你已經編寫了測試類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)
 

注意:在該測試實例中建立了參考日期,因此在任何測試方法中修改這些日期都不會對其他測試產生不利影響。你可以將代碼放到這兩個方法中,以建立和釋放每個測試所需要的資源(如數(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表示不顯示任何內容,而on只顯示測試報告(沒有測試類的輸出)。junit任務具有很多屬性,詳細內容請參考Ant的文檔。

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