經過長時間積極的開發之后,JUnit 4.0 于今年年初發布了。JUnit 框架的某些最有趣的更改 —— 特別是對于本專欄的讀者來說 —— 正是通過巧妙地使用注釋實現的。除外觀和風格方面的顯著改進外,新框架的特性使測試用例的編制從結構規則中解放出來。使原來僵化的 fixture 模型更為靈活,有利于采取可配置程度更高的方法。因此,JUnit 框架不再強求把每一項測試工作定義為一個名稱以 test
開始的方法,并且現在可以只運行一次 fixture,而不是每次測試都需要運行一次。
雖然這些改變令人欣慰,但 JUnit 4 并不是第一個提供基于注釋的靈活模型的 Java™ 測試框架。在修改 JUnit 之前很久,TestNG 就已建立為一個基于注釋的框架。
事實上,是 TestNG 在 Java 編程中率先 實現了利用注釋進行測試,這使它成為 JUnit 的有力競爭對手。然而,自從 JUnit 4 發布后,很多開發者質疑:二者之間還有什么差別嗎?在本月的專欄中,我將討論 TestNG 不同于 JUnit 4 的一些特性,并提議采用一些方法,使得這兩個框架能繼續互相補充,而不是互相競爭。
![]() |
|
JUnit 4 和 TestNG 有一些共同的重要特性。這兩個框架都讓測試工作簡單得令人吃驚(和愉快),給測試工作帶來了便利。二者也都擁有活躍的社區,為主動開發提供支持,同時生成豐富的文檔。
![]() |
|
兩個框架的不同在于核心設計。JUnit 一直 是一個單元測試框架,也就是說,其構建目的是促進單個對象的測試,它確實能夠極其有效地完成此類任務。而 TestNG 則是用來解決更高 級別的測試問題,因此,它具有 JUnit 中所沒有的一些特性。
初看起來,JUnit 4 和 TestNG 中實現的測試非常相似。為了更好地理解我的意思,請看一下清單 1 中的代碼。這是一個 JUnit 4 測試,它有一個 macro-fixture(即僅在所有測試運行前調用一次的 fixture),這個 macro-fixture 由 @BeforeClass
屬性表示:
package test.com.acme.dona.dep; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.BeforeClass; import org.junit.Test; public class DependencyFinderTest { private static DependencyFinder finder; @BeforeClass public static void init() throws Exception { finder = new DependencyFinder(); } @Test public void verifyDependencies() throws Exception { String targetClss = "test.com.acme.dona.dep.DependencyFind"; Filter[] filtr = new Filter[] { new RegexPackageFilter("java|junit|org")}; |