TestNG vs JUnit – 它们之间的区别
TestNG 与 JUnit 的主要区别
- TestNG 是一个基于 Java 的框架,而 JUnit 是一个用于 Java 的开源单元测试框架。
- 比较 TestNG 与 JUnit,TestNG 注解比 JUnit 更易于使用和理解。
- TestNG 允许我们创建并行测试,而 JUnit 不支持运行并行测试。
- 在 TestNG 中,测试用例可以分组,而在 JUnit 中,无法对测试进行分组。

什么是 TestNG?
TestNG 是一个自动化测试框架,其中 NG 代表“下一代”。TestNG 受 JUnit 启发,后者使用注解 (@)。TestNG 克服了 JUnit 的缺点,旨在使 端到端测试 变得容易。
使用 TestNG,您可以生成一份正确的报告,并且您可以轻松了解有多少测试用例通过、失败和跳过。您可以单独执行失败的测试用例。
什么是 JUnit?
JUnit 是一个用于 JAVA 的开源单元测试框架。它对于 Java 开发人员编写和运行可重复测试很有用。它最初由 Erich Gamma 和 Kent Beck 开发。它是 xUnit 架构的一个实例。顾名思义,它用于对一小段代码进行 单元测试。
遵循测试驱动方法的开发人员必须在编写任何代码之前先编写并执行单元测试。
完成代码后,您应该执行所有测试,并且所有测试都应该通过。每次添加任何代码时,您都需要重新执行所有测试用例,并确保没有出现任何问题。
JUnit 和 TestNG 之间的区别
TestNG 和 JUnit4 除了一个或两个功能外,看起来很相似。让我们对两者进行比较,以便快速决定哪种技术更适合单元测试。下表突出显示了两者都支持的功能
注解
JUnit 和 TestNG 都使用注解,并且几乎所有注解都看起来相似。
TestNG 使用 @BeforeMethod、@AfterMethod,类似于 JUnit4 中的 @Before、@After。
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 | 不适用 |
套件测试
套件用于将多个测试一起执行。TestNG 和 JUnit4 都可以创建套件。然而,TestNG 中的套件功能更强大,因为它使用非常不同的方法来执行测试。让我们通过下面的代码片段来理解它
使用 JUnit4
以下类描述了在 JUnit4 中使用套件
package guru99.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 中均已实现。超时用于终止运行时间超过指定时间(以毫秒为单位)的测试。
使用 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 注解需要一个测试参数。用作参数的数据将在 TestNG 的 XML 配置文件中提供。通过这样做,我们可以使用不同的数据集重用一个测试用例,并且可以得到不同的结果。
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。我们也看到除了参数化测试和依赖测试之外,两者是相似的。简而言之,我们可以说,根据灵活性和要求,我们可以选择其中一个进行单元测试。