Java中的TestNG与JUnit测试框架:哪个更好?

2021-09-13 09:58:17 浏览数 (4101)

介绍

软件开发经历了许多阶段,如需求收集和分析、沟通、设计、代码构建、测试和发布。企业必须确保他们交付的产品符合标准,当产品通过多维质量检查时,这是非常有必要的。测试是 SDLC 不可或缺的一部分,可以手动或自动完成。单元测试是一种可靠的测试形式,它涉及测试软件的每个组件。像 ​JUnit​ 和 ​TestNG​ 这样的单元测试框架呈现出相似的测试根源,因此关于 ​TestNG​ 与 ​JUnit​ 的争论仍然存在。  

什么是单元测试?

测试不是单一的活动,而是涵盖各种测试场景。它以不同的方式进行分类,其中一种是基于测试级别,例如集成、单元和系统测试。基于目标的应用程序测试涵盖移动测试、Web 和混合测试。

单元测试涉及测试软件产品中最微小的代码。目的是检查代码的每个组件的质量是否按预期执行。它在开发阶段执行。一段代码被隔离以确保其有效性和准确性。代码的单个组件可以是函数、模块、对象或方法。考虑任何软件工程;单元测试总是在集成测试之前先执行。它有助于在应用程序开发生命周期的早期阶段识别和解决错误。开发人员使用不同的单元测试框架来创建单元测试的自动化测试用例。市场上有不同的工具可以执行单元测试,如 ​JUnit​、​NUnit​、​PHPUnit​、​JMockit ​等。

公司使用不同的单元测试框架来管理测试成本,提高速度、效率和准确性。在​Selenium – Java​ 中,​JUnit ​和 ​TestNG ​是最受欢迎的单元测试框架。 

 JUnit  于 1997 年作为基于 Java 的开源单元测试框架推出。它是 ​XUnit ​的一部分,​XUnit​ 是单元测试框架系列的代表。它允许开发人员编写和运行可重复的测试。它与 Selenium 一起广泛用于编写 Web 自动化测试。其最新的程序员友好版本是 ​JUnit 5​,它为 Java 虚拟机上基于开发人员的测试创建了一个强大的基础。 

TestNG  也是一个基于 Java 的单元测试框架,于 2007 年在 ​JUnit ​的同一行上开发,但具有新的和改进的功能。这些新功能包括灵活的测试配置、参数支持、数据驱动测试、注释、各种集成等等。​TestNG​ 执行单元、端到端和集成测试。​TestNG​ 生成报告,帮助开发人员了解所有测试用例的通过、失败和跳过状态。借助 Selenium 中的 ​TestNG​,您可以使用​estng-failed.xml​ 文件单独运行失败的测试,以仅运行失败的测试用例。根据 ​mvnrepository.com​,截至 2021 年 2 月,​TestNG ​的最新版本是 ​7.4.0​。

必须了解 ​TestNG ​和 ​JUnit ​测试框架之间的区别,以确定这两个自动化测试框架中的哪一个最适合您的项目。

TestNG 和 JUnit 的区别 

TestNG​和​JUnit​虽然没有明显区别,但都是最顶级的基于Java的自动化框架,各有优缺点。尽管如此,让我们尝试了解 ​Selenium WebDriver​ 中 ​JUnit ​和 ​TestNG ​框架之间的主要区别:

1、测试套件

测试套件由一组 JUnit 和 TestNG 测试组成,允许您同时执行测试。早期版本的 JUnit 中不允许使用测试套件功能,但它是在 JUnit 5 中引入的,而该功能始终存在于 TestNG 中。尽管两者都有测试套件,但它们对每个套件执行测试的方式存在关键差异。让我们看一下展示测试套件如何在两个框架中运行的代码片段。

TestNG中的测试套件从 XML 文件运行:

<suite name=”TestSuite”>
    <test name=”Demo”>
        <classes>
            <class name=”com.fsecure.demo.testng.TestNGTest1″ />
            <class name=”com.fsecure.demo.testng.TestNGTest2″ />
        </classes>
    </test>
</suite>

而在 JUnit 中,使用了 ​@RunWith​ 和 ​@Suite​ 之类的注释,如下面的代码片段所示。两个类 JUnit 1 和 2 是使用注解​@Suite​ 编写的。

@RunWith(Suite.class)
@Suite.SuiteClasses({
   JUnit1.class,
   JUnit2.class
})
public class JunitTest5 {
   //code
}

2、 注释

对于测试人员来说,使用 TestNG 更容易,因为它为他们提供了多个选项来使用测试套件。例如,可以通过将类捆绑成组来执行测试套件。

JUnit 和 TestNG 框架中使用的注释的工作方式相似,只是名称略有不同。下表显示了 JUnit 和 TestNG 注释的差异。

特征联队 5测试
将方法标记为测试方法@Test@Test
它在类的第一个测试方法之前执行@BeforeAll@BeforeClass
它在当前类的所有测试方法都执行完毕后执行。@AfterAll@AfterClass
它在每个测试方法之前执行@BeforeEach@BeforeMethod
在每个测试方法之后执行@AfterEach@AfterMethod
它在套件中的所有测试运行之前执行。不适用@BeforeSuite
它在套件中的所有测试都运行后执行。不适用@AfterSuite
在测试之前执行。不适用@BeforeTest
测试后执行。不适用@AfterTest
在任何这些组的第一个测试方法之前执行。不适用@BeforeGroups
在任何这些组的第一个测试方法之后执行。不适用@AfterGroups
忽略测试@Disabled(在 JUnit4 中是 @ignore)@Test(Enable=false)
预期异常@Test(expected=ArithmeticException0.class )@Test( expectedException
=ArithmeticException.class )
暂停@TimeOut@Test(timeout = 1000)

在 JUnit 4 中,​@BeforeClass​ 和 ​@AfterClass​ 方法被认为是静态的,而在 TestNG 中没有这样的限制。

JUnit
TestNG

TestNG vs. JUnit——测试用例管理

测试执行的管理是一项重要任务;与 JUnit 相比,TestNG 使此任务更容易。TestNG 在以下方面的帮助下实现了这一点:

  • 分组测试用例:这是一项仅适用于 TestNG 的功能。 它涉及通过创建多个组来执行任务。每个都包含各种类,并且可以在单独的组中运行测试,而不是运行孤立的测试。它使用​@Test​ 注释中的参数。
@Test(groups={"groupname1",<"group2">..,<"groupN">})

忽略测试:不需要执行来自庞大测试套件的某些测试,尤其是当您只想测试特定功能时。 此功能阐明是否应忽略或考虑特定的单元测试。JUnit 和 TestNG 都配备了此功能,以及前面讨论的所有注释。在 JUnit 中,此功能使用 ​@ignore ​注解:在 TestNG 中,组包含在“groups”标签下的 XML 文件中,可以在 <test> 或 <suite> 标签下轻松识别。

@Ignore
public void method1()
{  
     //code
}

而在 TestNG 中,它使用 ​@Test( enabled = false )​ 注释运行。

@Test(enabled=false)
public void TestWithException()
{ 
    //code
}
  • 参数化:这意味着在每次测试执行时填充值/参数。结果,我们得到了改进的代码可重用性。它是数据驱动的测试,可减少代码长度并提高其可读性。TestNG 与 JUnit 提供此功能的方式有所不同。TestNG 有一个简单的方法来修复测试用例中的参数。它利用​@Parameter​ 注释并将参数添加到给定的测试方法。“浏览器”的值在 XML 文件(例如 testng.xml)中声明,而 JUnit 使用 ​@ParameterizedTest ​注释。
  • 依赖测试:此功能显示一种测试方法何时依赖于另一种测试方法。JUnit 不支持此功能,而 TestNG 支持。由于 TestNG 是最新的,它支持多种类型的测试。在TestNG中,依赖方法使用​@DependsOnMethods​注解。
@Test(dependsOnMethods = {"LoginBrowser"})
//code
  • 异常测试:此功能验证在测试执行期间遇到错误时要使用的异常。TestNG 和 JUnit 都提供此功能,但处理异常的方式略有不同。TestNG在​@Test ​注释中使用 ​expectedException ​参数 

在 JUnit 中,​assertThrows API​ 用于异常处理

@Test(expectedExceptions = ArithmeticException.class)
public void DivideByZero() {
  int i = 10/0;
}
  • 超时测试:这允许测试执行中的超时功能设置时间限制,当超过时,测试自动失败。TestNG 和 JUnit 都以相同的语法提供此功能。
@Test(expected = ArithmeticException.class)
public void DivideByZero() {
  int i = 10/0;
}

TestNG 与 JUnit – 并行测试执行

最有效的测试方法之一是执行并行测试。在基于云的 Selenium Grid 上同时而不按顺序运行测试比在本地 Selenium Grid 上执行它支持更多的并行性。TestNG 和 JUnit 5 都支持并行测试。

TestNG 与 JUnit – 报告

报告是测试中分析测试结果的重要要求。TestNG 默认生成 HTML 和索引报告。JUnit 不会为测试执行创建任何此类报告,而是以 XML 文件格式提供数据。你必须使用带有 JUnit 的附加外部插件来创建报告。

TestNG 与 JUnit – 社区支持

TestNG 和 JUnit 都是各自社区中的流行框架。JUnit 是在 TestNG 之前引入的,这就是为什么它具有相对更广泛和更强大的社区支持。TestNG 正在逐渐迎头赶上,其用户群也每天以更快的速度增长。

结论

许多测试框架都支持自动化测试,具体取决于你的测试目标是什么。TestNG 和 JUnit 是自动化单元测试领域最受信任的框架之一。TestNG克服了JUnit的异常,减轻了测试人员的任务。使用 TestNG,可以执行单元测试、集成测试和端到端测试,而 JUnit 仅涵盖单元测试。TestNG 和 JUnit 之间有很多不同之处,但它们有很多共同之处。因此,迫切需要在单元测试上下文中讨论 TestNG 与 JUnit。我们希望这项比较研究可以帮助您了解框架在单元测试中的作用,并帮助你选择适合你的测试需求和业务需求的框架。