TestNG和Junit都是用于单元测试的测试框架。TestNG类似于JUnit,添加了几个使TestNG比JUnit更强大的功能。
本教程主要分析JUnit和TestNG的特性。让我们先分析一下TestNG和JUnit4之间的相似之处。
TestNG是一个受JUnit和NUnit启发的测试框架。
下表显示了JUnit和TestNG支持的特性。
JUnit4和TestNG功能比较
除了一两个特性之外,TestNG和JUnit4看起来很相似。让我们将两者进行比较,看看下表重点介绍了两者支持的功能:

注释
JUnit和TestNG都使用注释,并且几乎所有的注释看起来都很相似。
TestNG使用@BeforeMethod、 @AfterMethod类似于JUnit4中的 @BeforeMethod 、 @AfterMethod 。
TestNG和Junit4都使用@Test(timeout = 1000) 超时。有关更多详细信息,查看下表-
编号 | 描述 | TestNG | JUnit 4 |
---|---|---|---|
1 | 测试注释 | @Test | @Test |
2 | 在当前类中调用第一个测试方法之前执行 | @BeforeClass | @BeforeClass |
3 | 在当前类中的所有测试方法之后执行 | @AfterClass | @AfterClass |
4 | 在每个测试方法之前执行 | @BeforeMethod | @Before |
5 | 在每个测试方法之后执行 | @AfterMethod | @After |
6 | 用于忽略测试的注释 | @ Test(enable=false) | @Ignore |
7 | 异常的注解 | @ Test(expectedExceptions = ArithmeticException.class) | @ Test(expected = ArithmeticException.class) |
8 | 超时 | @ Test(timeout = 1000) | @ Test(timeout = 1000) |
9 | 在套件中的所有测试之前执行 | @BeforeSuite | 不适用 |
10 | 在套件中的所有测试之后执行 | @AfterSuite | 不适用 |
11 | 在测试运行之前执行 | @BeforeTest | 不适用 |
12 | 在测试运行后执行 | @AfterTest | 不适用 |
13 | 在调用属于任何这些组的第一个测试方法之前执行 | @BeforeGroups | 不适用 |
14 | 在属于此处任何组的最后一个测试方法之后运行 | @AfterGroups | 不适用 |
套件测试
套件用于一起执行多个测试。让我们使用下面给出的代码片段来理解它:
使用JUnit4
下面的类介绍了使用JUnit4时Suite的用法:
package guru.junit;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
SuiteTest1.class,
SuiteTest2.class,
})
public class JunitTest {
// This class remains empty,it is used only as a holder for the above annotations
}
使用TestNG
TestNG使用XML将所有测试捆绑在一个地方。下面的XML描述了在使用TestNG时套件的使用:
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<classes>
<class name="com.guru99.SuiteTest1" />
<class name="com.guru99.SuiteTest2" />
</classes>
</test>
</suite>
忽略测试
使用这两种方法,我们可以跳过一个测试。让我们使用下面给出的代码示例来看一下:
使用JUnit4
下面的代码片段描述了在使用JUnit4时@Ignore注释的使用:
@Ignore
public void method1() {
System.out.println("Using @Ignore , this execution is ignored");
}
使用TestNG
下面的代码片段描述了在使用TestNG时@ Test(enabled=false) 注释的使用:
@Test(enabled=false)
public void TestWithException() {
System.out.println("Method should be ignored as it's not ready yet");
}
异常测试
异常测试在TestNG和JUnit4中都可用。它用于检查测试抛出了哪个异常?
使用JUnit4
下面的代码片段描述了在使用JUnit4时异常测试的使用:
@Test(expected = ArithmeticException.class)
public void divideByZero() {
Int i = 1/0;
}
使用TestNG
下面的代码片段描述了在使用TestNG时异常测试的用法:
@Test(expectedExceptions = ArithmeticException.class)
public void divideByZero() {
Int i = 1/0;
}
超时
此功能在TestNG和JUnit4中都实现。Timeout用于终止耗时超过指定时间(以毫秒为单位)的测试。
使用JUnit4
下面的代码片段描述了在使用JUnit4时使用超时测试:
@Test(timeout = 1000)
public void method1() {
while (true);
}
使用TestNG
下面的代码片段描述了在使用TestNG时使用超时测试:
@Test(timeOut = 1000)
public void method1() {
while (true);
}
参数化测试
JUnit提供了一种更简单、更易读的测试方法,称为参数化测试。TestNG和JUnit让我们逐一了解这一点。
使用JUnit4
“ @runwith ”和“ @Parameter ”注释用于为单元测试提供参数值。注释@Parameters必须返回list[]。此参数将作为参数传递到类构造函数中。
@RunWith(value = Parameterized.class)
public class JunitTest {
privateint number;
public JunitTest6(int number) {
this.number = number;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] { { 1 }, { 2 }, { 3 }, { 4 } };
returnArrays.asList(data);
}
@Test
public void parameterTest() {
System.out.println("Parameterized Number is : " + number);
}
}
使用TestNG
在TestNG中,使用XML文件或“ @DataProvider ”来提供测试参数。
在这里,方法中声明的@Parameters注释需要一个参数进行测试。通过这样做,我们可以重用具有不同数据集的单个测试用例,并且我们可以得到不同的结果。
public class Test1 {
@Test
@Parameters(value="number")
public void parameterTest(int number) {
System.out.println("Parameterized Number is : " + number);
}
}
参阅下面要用于以上类的XML文件:
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<parameter name="number" value="2"/>
<classes>
<class name="com.guru99.Test1" />
</classes>
</test>
</suite>
总结:
我们详细了解了JUnit4和TestNG的比较。我们也看到两者是相似的,简而言之,我们可以说,基于灵活性和需求,我们可以选择它们中的任何一个进行单元测试。