TestNG是一個Java語言的測試框架,由Cédric Beust受到JUnitNUnit英語NUnit的啟發而建立。TestNG的設計目標是,覆蓋更廣泛的測試類別範圍:單元測試、功能測試、端到端測試、整合測試等,並且功能更強大、更易於使用。

TestNG
開發者Cédric Beust、TestNG團隊
目前版本6.12[1](2017年2月28日 (2017-02-28)
原始碼庫 編輯維基數據鏈結
程式語言Java
作業系統跨平台
類型單元測試工具
許可協定Apache許可證2.0[2]
網站http://testng.org/

功能

編輯

TestNG的主要功能包括:

  1. 支援註解。
  2. 支援參數化和資料驅動測試(用@DataProvider和/或XML組態)。
  3. 支援同一個類的多個實例(用@Factory)。
  4. 靈活的執行模式。TestNG的執行,既可以通過Ant的build.xml(有或沒有一個測試套定義),又可以通過帶有視覺化效果的IDE外掛程式。不需要TestSuite類,測試套件、測試組及選擇執行的測試,都通過XML檔案來定義和組態。
  5. 並行測試:測試執行在任意大的執行緒池中,並有多種策略可選(所有方法都有他們自己的執行緒,或每個測試類一個執行緒,等等);測試代碼是否執行緒安全。
  6. 嵌入BeanShell英語BeanShell可以獲得更大的靈活性。
  7. 預設的JDK執行時和紀錄檔功能(無依賴)。
  8. 應用伺服器測試的依賴方法。[需要解釋]
  9. 分散式測試:允許在從機上進行分散式測試。

資料提供者

編輯

TestNG中的資料提供者是測試類中的一個方法,該類為依賴測試方法提供了一個不同實際值的陣列。

例如:

	/**
	 * 本方法可为任何测试方法提供数据,只要声明测试方法的数据提供者名为
	 * “provider1”即可。
	 */
	@DataProvider( name = "provider1" )
	public Object[][] createData1()
	{
		Object[][] objects = new Object[2][];
		objects[0] = new Object[] { "Cedric", 36 };
		objects[1] = new Object[] { "Anne", 37 };
		return  objects;
	}

	/**
	 * 本测试方法声明其数据应由名为“provider1”的数据提供者提供。
	 */
	@Test( dataProvider = "provider1" )
	public void verifyData1( String s, Integer i )
	{
		System.out.println( s + ' ' + i );
	}

	/**
	 * 本数据提供者返回一个参数数组的迭代器。
	 */
	@DataProvider( name = "provider2" )
	public Iterator<Object[]> createData()
	{
		return new MyIterator( ... );
	}

	/**
	 * 本数据提供者带有一个 java.lang.reflect.Method 类型的参数。如果多个测试方
	 * 法使用同一个提供者,而且你又希望它能根据不同的测试方法返回不同的值,本方
	 * 法就非常有用。
	 */
	@DataProvider( name = "provider3" )
	public Object[][] createData( Method m )
	{
		System.out.println( m.getName() );
		return new Object[][] { new Object[] { "Cedric" } };
	}

資料提供者的返回值類型可以是以下兩種類型之一:

  • 一個Object二維陣列(Object[][]),其中第一維的大小是測試方法將被呼叫的次數,第二維的大小包含一個對象陣列,對象陣列必須與測試方法的參數類型一致。
  • 一個Object迭代器(Iterator<Object[]>)。它與前一種類型的唯一區別是,迭代器可以讓你延遲建立你的測試資料。TestNG將先後呼叫該迭代器和測試方法,而測試方法的參數則由該迭代器依次返回。如果你有很多參數集要傳遞給測試方法,而你又不想事先把它們全部建立出來,這就非常有用了。

工具支援

編輯

TestNG既有現成軟體,又可以通過IDE外掛程式來呼叫。目前三大主流Java IDE——EclipseIntelliJ IDEANetBeans——都有針對TestNG的外掛程式。它也可以組態為Apache Ant的客製化任務,並且支援Apache Maven構建系統。Hudson持續整合伺服器已經內建了對TestNG的支援,並能進行跟蹤,及隨時間推移對測試結果進行視覺化。多數Java代碼覆蓋率工具,如Cobertura英語Cobertura,都可以與TestNG無縫銜接。

測試報告

編輯

TestNG可以生成HTML和XML格式的測試報告。Ant的JUnitReport任務[3]可以轉換XML輸出,生成與使用JUnit時所獲得的類似的報告。從4.6版開始,TestNG還提供了一個報告API。[4]通過該API可以使用第三方的報告生成器,如ReportNG、[5]PDFngreport[6]和TestNG-XSLT。[7]

與JUnit的對比

編輯

TestNG和JUnit是兩個相似且相互競爭的Java工具,它們之間的差異及各自優勢已經討論了多年。兩大陣營都有強大的基礎和支持者。Stack Overflow的討論可以反映這一爭議。[8][9][10]

註解

編輯

在JUnit 4中,@BeforeClass和@AfterClass方法必須被聲明為靜態的。而TestNG沒有這個限制。

TestNG為套件、測試和組提供了四對額外的裝/卸註解,即@BeforeSuite和@AfterSuite,@BeforeTest和@AfterTest,@BeforeGroup和@AfterGroup,@BeforeMethod和@AfterMethod。

參數化測試

編輯

這兩個工具都實現了這個功能,但實現方式截然不同。

TestNG有兩種方式來為測試方法提供不同的參數值:設定testng.xml,及定義@DataProvider的方法。

在JUnit 4中,使用@RunWith和@Parameters一起來實現參數化測試,而@Parameters方法必須返回List[],它攜帶所有實際的值,這些值將作為參數被傳遞給專門的類構造器。

結論

編輯

JUnit常常被主流IDE預設支援,這有助於其更廣泛的普及。而TestNG的目標則更廣泛,不僅包括單元測試,還支援整合測試和驗收測試等。哪一個更好或更適合,取決於使用情況和要求。

參見

編輯

參考文獻

編輯
  1. ^ 存档副本. [2017-11-10]. (原始內容存檔於2019-02-18). 
  2. ^ Apache License Version 2.0 [Apache許可證2.0版]. 2004年1月 [2017-11-10]. (原始內容存檔於2013-12-21) (英語). 
  3. ^ JUnitReport. [2017-11-10]. (原始內容存檔於2010-02-24) (英語). 
  4. ^ Announcing TestNG 4.6 [TestNG 4.6發布]. [2017-11-10]. (原始內容存檔於2010-12-12) (英語). 
  5. ^ ReportNG 1.0 Final Released [ReportNG 1.0最終版發布]. [2017-11-10]. (原始內容存檔於2010-01-11) (英語). 
  6. ^ PDFngreport 1.0.0. [2017-11-10]. (原始內容存檔於2015-07-26) (英語). 
  7. ^ TestNG XSL Reports [TestNG XSL報告]. [2017-11-10]. (原始內容存檔於2013-03-07) (英語). 
  8. ^ Junit vs TestNG [Junit對TestNG]. stackoverflow.com. [2017-11-10]. (原始內容存檔於2017-04-04) (英語). 
  9. ^ JUnit vs TestNG [JUnit對TestNG]. stackoverflow.com. [2017-11-10]. (原始內容存檔於2014-02-02) (英語). 
  10. ^ Which UnitTest framework to learn for Java now? [現在學Java用哪個測試框架?]. stackoverflow.com. [2017-11-10]. (原始內容存檔於2016-11-04) (英語). 

外部連結

編輯