單元測試框架TestNg使用總結

工欲善其事,必先利其器java

單元測試的重要性是不言而喻的。但若是沒有好的單元測試工具,是沒法激起開發人員的慾望。數組

Testng即是利器之一。TestNG是基於Annotation的測試框架的先驅,他擁有經過添加諸如靈活的裝置、測試分類、參數測試和依賴方法等特性來克服JUnit3的一些不足之處。下面我將總結一些TestNg的重要特性。架構

關於testng.xml

Testng.xml是以xml記錄全部測試的文件。它描述了測試套件的運行時定義,也是testng中運行測試的最大工做單元。雖然沒有testng.xml文件,測試也很容易被執行。可是隨着測試代碼的增加,testng.xml提供了方便用來存放全部運行時的配置,如設置有關類,測試,方法,參數,分組的包含與排除等。在測試類愈來愈多時,它就顯得很是重要。併發

Testing.xml的主要結構框架

根標籤是<suite>異步

<suite>標籤包含一個或多個<test>標籤ide

<test>標籤包含一個或多個<classes>標籤函數

<classes>標籤包含一個或多個<method>標籤工具

通常來講,大多數文件詳細到<classes>標籤便可。性能

Testing.xml的額外標籤

<packages>和<package>:顧名思義,它們能夠指定一組java包,在這個標籤中還能夠用包含<include>或者排除<exclude>屬性。

<parameter>定義了參數名稱和值,它的使用是與測試類當中@Parameters的註釋結合使用的,做用和@Dataprovider相似,提供外部參數,功能不如@Dataprovider強大,有侷限性。

<suite-files>和<suite-file>:它是用來引入其餘testng.xml文件的,這些文件將於當前文件一塊兒執行。

<groups>,<define>和<run>:這三個標籤結合使用,在執行時用來指定或者排除一部分的分組,以一個例子見分曉:

 

 

Xml代碼  
  1. <groups>  
  2.   <define name=」all」>  
  3.      <include name=」test1」/>  
  4.      <exclude name=」test2」/>  
  5.   </define>  
  6.   <run>  
  7.     <include name=」all」/>  
  8.   </run>  
  9. <groups>  

 

注意執行測試的默認順序是按照testng.xml裏給定的順序執行的。若是你不但願按此順序執行,請使用preserve-order屬性指定爲false。如<test name="Regression1" preserve-order="false">。關於testng.xml的標籤詳細說明,可參見testng.xml的官方文檔。

 

在實際開發時,我建議testng.xml以功能點爲粒度進行劃分。而後以總的testng.xml將各個功能點的配置彙總起來。

參數傳遞

Testng改進了傳統測試框架沒法傳遞參數的缺點,它可以提供了想測試方法傳遞參數的最簡單兩種的方法:

1,在測試方法上加@Parameters標籤,而後在testng.xml給出參數。

2,指定@Dataproviders。

第一種方式的缺點很明顯,它只支持java基本類型,而且在構造值時,沒法包含計算邏輯獲得須要的參數。

第二種方式能夠想測試方法傳遞任何有效的java類型。咱們傾向於第二種方法來構造參數。

 

在此,咱們再介紹一種傳遞參數的方式:工廠註釋@Factory,它不一樣於前面兩種參數傳遞。

讓咱們回顧一下普通的testng測試,這些測試類是無參數構造方法(默認構造方法,沒法接受參數)的。@Factory的出現,正是彌補這一缺陷而產生的。@Factory的方法在執行時會被首先檢查並執行,且只執行一次。執行完之後返回一個Object數組。這個數組裏對象的內容即是當前測試方法帶了構造函數的實例。在使用@Factory的同時,該測試類還有一個對應帶參數的構造函數,@Factory就是爲以構造函數提供參數的形式提供了幫助。

 

測試的依賴與分組

咱們在將依賴與分組放在一塊兒描述,是由於他們之間有着緊密的聯繫。

測試依賴

測試方法之間的依賴是一種很常見的需求,您也許認爲,測試之間的依賴不是破壞了測試方法之間的隔離性嗎?確實是這樣的,可是有時爲了這種隔離性,在彼此隔離的測試方法當中要付出很大的代價去相互模擬,因此爲了方便起見,testng提供了這種依賴的方式。

Testng當中經過@Test的屬性dependsOnMethods,dependsOnGroups來實現針對方法和分組的依賴。

依賴還包括軟依賴和硬依賴。硬依賴是很強的關聯,若是被依賴的測試失敗,那麼依賴它的測試會跳過。而軟依賴則不會跳過。經過給@Test設定alwaysRun=true來實現軟依賴。使用依賴時須要注意的是要避免循環依賴

測試分組

Testing當中提供的組名,與java當中包的概念有些相似,都是將包含類似點的類歸爲一組。

分組的最重要的目標就是:使固定的測試代碼和執行哪些測試實現清晰的分離。當你須要指定執行哪些組的測試時,在動態執行時指定組便可。

關於分組的語法是很是簡單的,@Test,@BeforeClass,@AfterClass,@BeforeMethod等均可以屬於分組。相關的語法是@Test(groups=」group1」),一個@Test的groups還能夠指定多個組名,如@Test(groups=」group1,groups2」)。

定義好的組名,實際上是給運行時使用的,也就是在testng.xml文件當中能夠配置。前面的testng.xml說明當中就提到了<groups>的用法。

Group的組織能夠根據各類維度來進行劃分,如單元測試,集成測試,性能測試。或者是框架分層來劃分如action,service,dao等。在配置文件當中還能夠定義組中組,經過define標籤來實現,前面也有所說明。

在通常項目中,我建議組分類可按照架構分層來定義,分爲基礎功能,service業務以及dao層。

expectedExceptions

用expectedExceptions來測試異常有兩個好處:其一,它消除了try/catch語句給代碼帶來的干擾。其二,使得測試代碼表達的意圖更加清楚。只要看到@Test註釋當中定義的expectedExceptions屬性,就知道該測試方法的意圖,把Exception的用例和預期業務功能的用例分到不一樣測試方法中。

語法很簡單,@Test(expectedExceptions=」XXXException.class」) ,異常類能夠有多個,用逗號隔開。

異步與併發測試

異步與併發在單元測試當中一般都比較困難。

關於異步測試,如JMS,發送和接收是解耦的,若是是測試發送消息的方法,當收到響應時,會有返回值。根據這個場景,測試代碼一般是這樣:

 

 

Java代碼  
  1. Private volatile Boolean success=」false」;  
  2. @Test(groups=」send」)  
  3. Public void sendMessage(){  
  4.    //send message code  
  5. }  
  6.   
  7. @Test(timeOut=10000,invocationCount=1000,successPercentage=98,dependsOnGroups={「send」})  
  8. Public void waitForAnser(){  
  9.    While(!success){  
  10.      Thread.sleep(1000);  
  11.    }  
  12. }  

 

@Test(timeOut = 10000, invocationCount = 1000,successPercentage = 98),是用於測試系統的可用性和響應速度所設的值。這裏告訴testng調用該方法1000次,若是98%的調用是成功的,就認爲是經過測試。固然,前面也要調用sendMessage方法1000次。timeOut是防止死鎖而產生的。

Testing內建了對併發的支持,能夠分爲兩種

1,併發測試

Testng在作併發測試時提供了threadPoolSize,invocationCount和timeOut三個屬性來完成。threadPoolSize能夠指定多個線程池來執行測試方法。

2,併發執行測試

Testing還能夠經過testng.xml來設置併發執行。testng.xml默認是單線程執行的。

<suite>標籤能夠設置parallel屬性。Thread-count指定線程數

parallel=」methods」:每一個測試方法都在它本身的線程中執行(以方法爲粒度)。

parallel=」tests」:在某個<test>標籤內的全部測試方法都在它本身的線程中執行(以<test>爲粒度)。

相關文章
相關標籤/搜索