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

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

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

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

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

您知道嗎?

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

 表面上的相似

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

提高代碼質(zhì)量

要找到您迫切問題的答案,請(qǐng)不要錯(cuò)過 Andrew 的 論壇。

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

一個(gè)簡(jiǎn)單的測(cè)試用例

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

清單 1. 一個(gè)簡(jiǎn)單的 JUnit 4 測(cè)試用例

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

更多的靈活性

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

清單 2. 一個(gè) TestNG 測(cè)試用例

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