TestNG和JUnit的不同

TestNG和Junit都是用于单元测试的测试框架。TestNG类似于JUnit,添加了几个使TestNG比JUnit更强大的功能。

本教程主要分析JUnit和TestNG的特性。让我们先分析一下TestNG和JUnit4之间的相似之处。

TestNG是一个受JUnit和NUnit启发的测试框架。

下表显示了JUnit和TestNG支持的特性。

JUnit4和TestNG功能比较

除了一两个特性之外,TestNG和JUnit4看起来很相似。让我们将两者进行比较,看看下表重点介绍了两者支持的功能:

JUnit Vs TestNG
JUnit Vs TestNG

注释

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的比较。我们也看到两者是相似的,简而言之,我们可以说,基于灵活性和需求,我们可以选择它们中的任何一个进行单元测试。

IT赶路人

专注IT知识分享