测试框架JUnit VS TestNG对比分析
作者:FunTester 发布时间:2023-02-11 02:44:02
引言
软件开发经历了许多阶段,如需求收集和分析、设计、软件开发、测试和发布。测试是 SDLC 不可或缺的一部分,单元测试是一种可靠的测试类型。像 JUnit 和 TestNG 这样优秀的单元测试框架已经成为主流选择,但是关于 TestNG 与 JUnit 的差异的争论一直存在。
单元测试
测试不是单一的活动,而是涵盖各种测试场景。它以不同的方式分类,其中一种是基于测试级别,例如集成、单元和系统测试。
单元测试涉及测试软件产品中最微小的代码。目的是检查代码的每个组件的质量是否按预期执行。它在开发阶段执行。隔离一段代码以确保其有效性和准确性。代码的单个组件可以是函数、模块、对象或方法。单元测试总是在集成测试之前进行。它有助于在应用程序开发生命周期的早期阶段发现缺陷。
开发人员使用不同的单元测试框架来创建单元测试的自动化测试用例。市场上有不同的工具可用于执行单元测试,如 JUnit、NUnit、PHPUnit、JMockit 等。
JUnit 于 1997 年作为一个开源的基于 Java 的单元测试框架推出。它是 XUnit 的一部分,它是单元测试框架家族的代表。它允许开发人员编写和运行可重复的测试。
TestNG 是一个基于 Java 的单元测试框架,具有新的和改进的功能。这些新功能包括灵活的测试配置、参数支持、数据驱动测试、注释、各种集成等等。TestNG 执行单元、端到端和集成测试。TestNG 生成报告,帮助开发人员了解所有测试用例的通过、失败和跳过状态。
了解 TestNG 和 JUnit 测试框架之间的区别,有助于选择最适合单元测试框架。
TestNG 和 JUnit 的区别
虽然 TestNG 和 JUnit 都是最顶级的基于 Java 的自动化框架,并且各有优缺点。下面分享 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
等注释,如下面的代码片段所示。两个类 JUnit1 和 JUnit2 是使用注解 @Suite
编写的。
@RunWith(Suite.class)
@Suite.SuiteClasses({
JUnit1.class,
JUnit2.class
})
public class JunitTest5 {
//code
}
使用 TestNG 对测试人员来说更容易,因为它为他们提供了使用测试套件的多种选择。例如,可以通过将类捆绑到组中来执行测试套件。
注释
FEATURE | JUNIT 5 | TESTNG |
---|---|---|
将该方法标记为测试方法 | @Test | @Test |
它在类的第一个测试方法之前执行 | @BeforeAll | @BeforeClass |
它在当前类的所有测试方法都执行完之后执行 | @AfterAll | @AfterClass |
它在每个测试方法之前执行 | @BeforeEach | @BeforeMethod |
在每个测试方法之后执行 | @AfterEach | @AfterMethod |
它在套件中的所有测试运行之前执行 | NA | @BeforeSuite |
它在套件中的所有测试都运行后执行 | NA | @AfterSuite |
测试前执行 | NA | @BeforeTest |
测试后执行 | NA | @AfterTest |
在任何这些组的第一个测试方法之前执行 | NA | @BeforeGroups |
在任何这些组的第一个测试方法之后执行 | NA | @AfterGroups |
忽略测试 | @Disabled (In JUnit4 it is @ignore) | @Test(Enable=false) |
预期异常 | @Test(expected=Arithmetic | @Test(expectedException=Arithmetic Exception.class) |
超时 | @Timeout | @Test(timeout = 1000) |
PS:在 JUnit 4 中,@BeforeClass
和@AfterClass
方法被认为是静态的,而在TestNG
中没有这样的限制。
用例管理
管理测试执行是一项重要任务;与 JUnit 相比,TestNG 使这项任务更容易。
分组测试
这个功能目前只有 TestNG 支持。 它涉及通过创建多个组来执行任务。每个都包含各种测试类,并且可以在单独的组中运行测试,而不是运行孤立的测试。它使用@Test
注解中的参数。
@Test(groups={"groupname1",<"group2">..,<"groupN">})
在 TestNG 中,可以在<test>
或<suite>
标记下轻松识别。
忽略测试
不需要执行来自大型测试套件的某些测试,尤其是只想测试特定功能时。此功能包含了是否应忽略或考虑特定的单元测试。JUnit 和 TestNG 都配备了这个特性,以及前面讨论的所有注释。在 JUnit 中,此功能使用@ignore
注解:
@Ignore
public void method1() {
//code
}
而在 TestNG 中,它使用@Test(enabled = false)
注释运行。
@Test(enabled=false)
public void TestWithException(){
//code
}
参数化
参数化可以理解是数据驱动的测试,可以减少代码量并提高其可读性。TestNG 与 JUnit 提供此功能的方式有所不同。TestNG 有一种简单的方法来修复测试用例中的参数。它利用@Parameter
注释并将参数添加到给定的测试方法。browser
的值在 XML 文件(例如testng.xml
)中说明,而 JUnit 使用@ParameterizedTest
注释。
依赖测试
这个功能表示一种测试方法何时依赖于另一种测试方法。JUnit 目前不支持此功能。TestNG 支持多种类型的测试。在 TestNG 中,依赖方法使用@DependsOnMethods
注解。
@Test(dependsOnMethods = {"Login"})
//code
异常测试
此功能验证在测试执行期间遇到错误时要使用的异常。TestNG 和 JUnit 都支持此功能,但处理异常的方式略有不同。TestNG 在@Test
注解中使用了expectedException
参数 。
在 JUnit 中,assertThrows API
用于异常处理:
@Test(expectedExceptions = ArithmeticException.class)
public void FunTester() {
int i = 10/0;
}
超时测试
这个功能指测试执行中的超时功能,该功能设置时间限制,当超过该时间限制时,测试会自动失败。TestNG 和 JUnit 都以相同的语法提供此功能。
JUnit:
@Test(timeout = 1000)
public void method1() {
// do nothing
}
TestNG:
@Test(timeOut = 1000)
public void testThisShouldFail() {
// do nothing
}
结论
许多测试框架都支持自动化测试,具体取决于测试的目标。TestNG 和 JUnit 都是自动化单元测试领域最受信任的框架。TestNG 克服了 JUnit 的诸多不便,简化了测试人员的工作。使用 TestNG,可以执行单元测试、集成测试和端到端测试,而 JUnit 仅涵盖单元测试。
来源:https://testerhome.com/articles/33576


猜你喜欢
- 一、引言这个五一假期自驾回老家乡下,家里没装宽带,用手机热点方式访问网络。这次回去感觉4G信号没有以前好,通过百度查找小说最新更新并打开小说
- 知识点:了解lxml模块和xpath语法的关系;了解lxml模块的使用场景;了解lxml模块的安装;了解 谷歌浏览器xpath helper
- 基于微信开放的个人号接口python库itchat,实现对微信好友的获取,并对省份、性别、微信签名做数据分析。效果:直接上代码,建三个空文本
- use 数据库 go EXEC sp_changeobjectowner ‘原表的所有者.表名',现在的所有者例如: exec sp
- MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两
- 启用Ad Hoc Distributed Queries:exec sp_configure 'show advanced opti
- 1、 在vue文件的html中引入element的上传控件,代码如下:<div> <el-upload action=&q
- mysql创建存储过程的官方语法为:START TRANSACTION | BEGIN [WORK]COMMIT [WORK] [AND [
- 全局变量是魔鬼。在YUI中,我们仅用两个全局变量:YAHOO和YAHOO_config。YUI的一切都是使用YAHOO对象级的成员或这个成员
- 介绍flask介绍Flask是一个轻量级的Python Web框架,它基于Werkzeug和Jinja2库构建,因其简洁、灵活、易扩展等特性
- 我的代码结构如下所示不能执行,会出现报错<RadioGroup v-model="animal"> <
- Vue学习笔记-3 前言Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件
- 一、什么是幻读在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做幻读。而多出来或者少的哪一行被叫做 幻行二、为什么要解决幻读在高并发
- 设计页面时,经常会从一个页面打开一个子窗口以供浏览者查看。通常,这种子窗口中的内容一经浏览者看过,对于浏览者而言就不再需要,而他们常常会忘记
- 项目(nodejs)中需要一次性插入多笔数据到数据库,数据库是mysql的,由于循环插入的性能太差,就像使用批量插入的方法提高数据的插入性能
- 导语哈喽铁汁们好久不见吖~小编已经复工了于是马不停蹄赶来给大家准备新年礼物算开工礼物吧!海龟来作图虎年就是要画老虎2022不用纸和笔~今晚画
- networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。图是由顶点、边和可选的属性构成的数据结构,顶点表示数据
- 1. 安装依赖将PyTorch模型转换为ONNX格式可以使它在其他框架中使用,如TensorFlow、Caffe2和MXNet首先安装以下必
- 一直记不住在jupyter notebook配置多环境编译器技巧,今总结于此,也希望对其他小伙伴有所帮助,如果有用请点赞!1.对window
- 原来看到这个代码的时候,觉得功能不错,调试并整理了一下也许大家用的到,对于越来越注重用户体验的今天,这种功能一定很受欢迎,当然本例子只是一个