您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > TestNG
JUnit 4與TestNG的對比
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2013/2/22 14:18:48 ] 推薦標(biāo)簽:

JUnit 4 具有基于注釋的新框架,它包含了 TestNG 一些優(yōu)異的特性。但這是否意味著 JUnit 4 已經(jīng)淘汰了 TestNG?Andrew Glover 探討了這兩種框架各自的獨特之處,并闡述了 TestNG 獨有的三種高級測試特性。

 經(jīng)過長時間積極的開發(fā)之后,JUnit 4.0 于今年年初發(fā)布了。JUnit 框架的某些有趣的更改 —— 特別是對于本專欄的讀者來說 —— 正是通過巧妙地使用注釋實現(xiàn)的。除外觀和風(fēng)格方面的顯著改進(jìn)外,新框架的特性使測試用例的編制從結(jié)構(gòu)規(guī)則中解放出來。使原來僵化的 fixture 模型更為靈活,有利于采取可配置程度更高的方法。因此,JUnit 框架不再強求把每一項測試工作定義為一個名稱以 test 開始的方法,并且現(xiàn)在可以只運行一次 fixture,而不是每次測試都需要運行一次。

雖然這些改變令人欣慰,但 JUnit 4 并不是第一個提供基于注釋的靈活模型的 Java? 測試框架。在修改 JUnit 之前很久,TestNG 已建立為一個基于注釋的框架。

事實上,是 TestNG 在 Java 編程中率先 實現(xiàn)了利用注釋進(jìn)行測試,這使它成為 JUnit 的有力競爭對手。然而,自從 JUnit 4 發(fā)布后,很多開發(fā)者質(zhì)疑:二者之間還有什么差別嗎?在本月的專欄中,我將討論 TestNG 不同于 JUnit 4 的一些特性,并提議采用一些方法,使得這兩個框架能繼續(xù)互相補充,而不是互相競爭。

您知道嗎?

在 Ant 中運行 JUnit 4 測試比預(yù)計的要難得多。事實上,一些團(tuán)隊已發(fā)現(xiàn),惟一的解決方法是升級到 Ant 1.7。

 表面上的相似

JUnit 4 和 TestNG 有一些共同的重要特性。這兩個框架都讓測試工作簡單得令人吃驚(和愉快),給測試工作帶來了便利。二者也都擁有活躍的社區(qū),為主動開發(fā)提供支持,同時生成豐富的文檔。

提高代碼質(zhì)量

要找到您迫切問題的答案,請不要錯過 Andrew 的 論壇。

 兩個框架的不同在于核心設(shè)計。JUnit 一直 是一個單元測試框架,也是說,其構(gòu)建目的是促進(jìn)單個對象的測試,它確實能夠極其有效地完成此類任務(wù)。而 TestNG 則是用來解決更高 級別的測試問題,因此,它具有 JUnit 中所沒有的一些特性。

一個簡單的測試用例

初看起來,JUnit 4 和 TestNG 中實現(xiàn)的測試非常相似。為了更好地理解我的意思,請看一下清單 1 中的代碼。這是一個 JUnit 4 測試,它有一個 macro-fixture(即僅在所有測試運行前調(diào)用一次的 fixture),這個 macro-fixture 由 @BeforeClass 屬性表示:

清單 1. 一個簡單的 JUnit 4 測試用例

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")};

Dependency[] deps =
finder.findDependencies(targetClss, filtr);

assertNotNull("deps was null", deps);
assertEquals("should be 5 large", 5, deps.length);
}
}

JUnit 用戶會立即注意到:這個類中沒有了以前版本的 JUnit 中所要求的一些語法成分。這個類沒有 setUp() 方法,也不對 TestCase 類進(jìn)行擴展,甚至也沒有哪個方法的名稱以 test 開始。這個類還利用了 Java 5 的一些特性,例如靜態(tài)導(dǎo)入,很明顯地,它還使用了注釋。

更多的靈活性

在清單 2 中,您可以看到同一個 測試項目。不過這次是用 TestNG 實現(xiàn)的。這里的代碼跟清單 1 中的測試代碼有個微妙的差別。發(fā)現(xiàn)了嗎?

清單 2. 一個 TestNG 測試用例

package test.com.acme.dona.dep;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Configuration;
import org.testng.annotations.Test;

public class DependencyFinderTest {
private DependencyFinder finder;

@BeforeClass
private void init(){
this.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")};

Dependency[] deps =
finder.findDependencies(targetClss, filtr);

assertNotNull(deps, "deps was null" );
assertEquals(5, deps.length, "should be 5 large");
}
}

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