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) (英語). 

外部連結