這兩天在看一本書《Java測試新技術(shù)TestNG和高級概念》,作者是 TestNG 的創(chuàng)始人,了解了不少關(guān)于 TestNG 的知識,看了一篇文章基本把這本書的幾個觀點都體現(xiàn)了,那我直接翻譯原文好,省得自己總結(jié)。這兩天要不是等原作者的授權(quán)的話可能本文發(fā)布了,沒經(jīng)過人家許可翻譯人家文章應(yīng)該的確也不是什么光彩的事情,等等無妨。原文鏈接JUnit 4 Vs TestNG – Comparison,非常感謝作者寫出好文,不過mkyong先生寫了的確好多文章,經(jīng)常搜個文章 google 第一篇總是他的。如果有翻譯問題,請拍磚。
————————————————————————————————————————————
Junit 4 和 TestNG 都是 Java 方面非常流行的單元測試框架。在功能上兩個框架都非常類似。到底哪個比較好?在Java項目中我們應(yīng)該選擇哪個框架?
下圖將會對Junit 4 和 TestNG 做個功能特征的對比。
注解支持
Junit 4 和 TestNG 在注解方面的實現(xiàn)非常相似。
JUnit 4 和 TestNG 之間注解方面的區(qū)別主要有以下幾點:
在Junit 4 中,如果我們需要在方法前面使用@BeforeClass和@AfterClass,那么該測試方法則必須是靜態(tài)方法。TestNG 在方法定義部分則更加的靈活,它不需要類似的約束。
3個附加的setUp/tearDown級別:套件和分組(@Before/AfterSuite, @Before/AfterTest, @Before/AfterGroup)。想了解詳細的請看這里
JUnit 4
@BeforeClass
public static void oneTimeSetUp() {
// one-time initialization code
System.out.println("@BeforeClass - oneTimeSetUp");
}
TestNG
@BeforeClass
public void oneTimeSetUp() {
// one-time initialization code
System.out.println("@BeforeClass - oneTimeSetUp");
}
在Junit 4中,注解的命名是比較令人困惑的,例如 Before, After and Expected,我們不是很確切的能理解在方法前面有Before和After這樣的注解是做什么的,同樣Expected也如此。TestNG在這方面做的好很多,注解使用了BeforeMethod,AfterMethod和ExpectedException,這樣的名字非常好理解了。
異常測試
異常測試的意思是在單元測試中應(yīng)該拋出什么異常是合理的,這個特性在兩個框架都已經(jīng)實現(xiàn)。
JUnit 4
@Test(expected = ArithmeticException.class)
public void divisionWithException() {
int i = 1/0;
}
TestNG
@Test(expectedExceptions = ArithmeticException.class)
public void divisionWithException() {
int i = 1/0;
}
忽略測試
忽略測試意思是在單元測試哪些是可以被忽略的,這個特性在兩個框架都已經(jīng)實現(xiàn)。
JUnit 4
@Ignore("Not Ready to Run")
@Test
public void divisionWithException() {
System.out.println("Method is not ready yet");
}
TestNG
@Test(enabled=false)
public void divisionWithException() {
System.out.println("Method is not ready yet");
}
時間測試
時間測試意思是如果一個單元測試運行的時間超過了一個指定的毫秒數(shù),那么測試將終止并且標(biāo)記為失敗的測試,這個特性在兩個框架都已經(jīng)實現(xiàn)。
JUnit 4
@Test(timeout = 1000)
public void infinity() {
while (true);
}
TestNG
@Test(timeOut = 1000)
public void infinity() {
while (true);
}
套件測試
套件測試是把幾個單元測試組合成一個模塊,然后運行,這個特性兩個框架均已實現(xiàn)。然而卻是用了兩個不同的方式來實現(xiàn)的。
JUnit 4
@RunWith 和 @Suite注解被用于執(zhí)行套件測試。下面的代碼是所展示的是在JunitTest5被執(zhí)行之后需要JunitTest1 和 JunitTest2也一起執(zhí)行。所有的聲明需要在類內(nèi)部完成。
@RunWith(Suite.class)
@Suite.SuiteClasses({
JunitTest1.class,
JunitTest2.class
})
public class JunitTest5 {
}
TestNG
執(zhí)行套件測試是使用XML文件配置的方式來做。下面的 XML 的文件可以使得TestNGTest1和TestNGTest2一起執(zhí)行。