当前位置: 首页 > news >正文

test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比

拓展阅读

test-01-java 单元测试框架 junit 入门介绍

test-02-java 单元测试框架 junit5 入门介绍

test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比

test assert-01-Google Truth 断言

test 系统学习-03-TestNG Spock testng 入门使用教程

开源推荐

sensitive-word 敏感词开源工具使用入门

testNG 的入门案例,包含 maven 引入

maven 依赖

<dependencies><!-- TestNG --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.3.0</version><scope>test</scope></dependency>
</dependencies>

测试类,和 junit 差不多:

import org.testng.Assert;
import org.testng.annotations.Test;public class TestNGExampleTest {@Testpublic void testAddition() {// 测试相加方法int result = add(2, 3);// 使用断言验证结果Assert.assertEquals(result, 5, "Addition failed: Expected 5, but got " + result);}@Testpublic void testSubtraction() {// 测试相减方法int result = subtract(5, 3);// 使用断言验证结果Assert.assertTrue(result > 0, "Subtraction failed: Expected result to be greater than 0");}private int add(int a, int b) {// 实际的相加方法return a + b;}private int subtract(int a, int b) {// 实际的相减方法return a - b;}
}

为什么已经有 junit4 了,还会有 testNG 呢?

JUnit 4 和 TestNG 都是用于Java应用程序测试的流行测试框架,它们有一些相似之处,但也有一些不同之处,导致在某些情况下选择使用 TestNG。

以下是一些原因:

  1. 更灵活的测试配置: TestNG 提供了更灵活的测试配置选项,可以通过 XML 文件进行配置,允许开发人员更细粒度地控制测试的执行方式,包括并发测试、测试组、测试套件等。

  2. 注解的丰富性: TestNG 提供了更多的注解,例如 @BeforeSuite@AfterSuite@BeforeTest@AfterTest 等,使测试方法的组织更加灵活。TestNG 的注解支持更丰富的测试生命周期管理。

  3. 参数化测试: TestNG 提供了更强大的参数化测试支持,通过 @DataProvider 注解,可以更轻松地实现数据驱动测试。

  4. 依赖测试: TestNG 具有更强大的依赖测试支持,可以通过 dependsOnMethodsdependsOnGroups 属性指定测试方法之间的依赖关系,确保测试方法按照指定的顺序执行。

  5. 测试分组和套件: TestNG 提供了更灵活的测试分组和测试套件功能,可以按照不同的维度组织测试,更容易管理和执行特定组的测试。

  6. 并发测试: TestNG 内置支持并发测试,可以配置测试套件中的测试以并行执行,提高测试效率。

  7. 监听器支持: TestNG 提供了丰富的监听器接口,可以通过实现这些接口定制测试执行期间的行为,例如,在测试开始或结束时执行一些操作。

  8. 软断言(Soft Assertions): TestNG 支持软断言,即使在断言失败时,测试方法仍然会继续执行,方便查看所有断言失败的情况。

  9. 跳过测试: TestNG 允许在测试方法上使用 @Test(enabled = false) 来标记测试方法为禁用状态,而不需要注释掉整个方法。

junit/junit5/testNG 等常见 java 测试框架的对比

功能/特性JUnit 4JUnit 5TestNG
注解@Test, @Before, @After, @Ignore, etc.@Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll, etc.@Test, @BeforeSuite, @AfterSuite, @BeforeTest, @AfterTest, etc.
参数化测试使用 @Parameters 注解支持参数化测试方法,通过 @ParameterizedTest@ValueSource 等注解支持参数化测试方法,通过 @Parameters 注解
断言使用 JUnit 提供的 Assert使用 JUnit 5 提供的 Assertions使用 TestNG 提供的 Assert
测试生命周期单一测试生命周期(@Before@After在每个测试方法前后执行)更灵活的测试生命周期,可以使用 @BeforeEach@AfterEach@BeforeAll@AfterAll更灵活的测试生命周期,支持 @BeforeSuite@AfterSuite@BeforeTest@AfterTest
依赖测试通过方法名指定依赖关系使用 dependsOnMethods 属性指定测试方法的依赖关系使用 dependsOnMethodsdependsOnGroups 属性指定测试方法或测试组之间的依赖关系
并发测试不直接支持并发测试支持并发测试,可以配置测试类或测试方法并发执行支持并发测试,可以在测试套件或测试方法级别设置并发数
测试分组通过命名规则或自定义注解进行分组使用 @Tag 注解进行分组使用 @Test(groups = "groupname") 进行分组
测试套件不直接支持测试套件使用 @RunWith 注解和 @Suite 注解支持测试套件支持通过 XML 文件配置测试套件
数据驱动测试通常通过参数化测试实现支持参数化测试和动态测试(通过 @TestFactory 实现)支持数据驱动测试,通过 @DataProvider 注解提供测试数据
监听器通过实现 TestWatcher 接口等实现支持扩展 TestExecutionListener 接口和 @ExtendWith 注解提供了丰富的监听器接口,通过实现这些接口实现监听功能
报告生成需要依赖第三方插件,如 Ant 或 Maven 插件支持通过插件生成报告,如 Maven Surefire 插件自动生成详细的 HTML 报告
软断言不支持软断言不支持软断言,但可以通过异常处理实现类似的效果支持软断言,即使在断言失败时,测试方法仍然会继续执行
开发者社区巨大且成熟正在逐渐增长,对于新项目可能还没有 JUnit 4 大成熟且广泛使用,拥有强大的社区支持

在这里插入图片描述

相关文章:

test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比

拓展阅读 test-01-java 单元测试框架 junit 入门介绍 test-02-java 单元测试框架 junit5 入门介绍 test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比 test assert-01-Google Truth 断言 test 系统学习-03-TestNG Spock testng 入门使用教程 开源…...

Maven 项目依赖仓库配置详解:pom.xml 中的 repositories 与 Maven 配置文件的调用顺序

Maven 项目依赖仓库配置详解&#xff1a;pom.xml 中的 repositories 与 Maven 配置文件的调用顺序 Maven&#xff08;Apache Maven&#xff09;是一个流行的项目管理工具&#xff0c;广泛用于Java项目的构建、依赖管理以及项目生命周期的管理。在Maven项目中&#xff0c;pom.x…...

JS深浅拷贝

区分 B复制了A的值&#xff0c;如果A被修改&#xff0c;B的值也被改变&#xff0c;那就是浅拷贝。 如果B的值没有跟着修改&#xff0c;那就是深拷贝 深浅拷贝的方式 1、遍历赋值 2、Object.create() 3、JSON.parse()和JSON.stringify() 浅拷贝-遍历 let a {name:"…...

uni-app 命令行创建

1. 首先创建项目&#xff0c;命令如下: npx degit dcloudio/uni-preset-vue#vite-ts uni-app-demo如果出现报错&#xff0c;如下图. 大概率就是没有目录C:\Users\Administrator\AppData\Roaming\npm 解决办法&#xff1a; 创建目录 C:\Users\Administrator\AppData\Roaming\n…...

ImageJ二值图像处理:形态学和分割

文章目录 二值化形态学处理分割 ImageJ系列&#xff1a; 安装与初步&#x1f48e; 灰度图像处理&#x1f48e; 图像滤波 二值化 在Process->Binary下有两个命令用于生成一个二值化图像&#xff0c;分别是 Make BinaryConvert to Mask 但当前图像是RGB或者灰度图时&…...

自动驾驶中的“雷达”

自动驾驶中有好几种雷达&#xff0c;新手可能会混淆&#xff0c;这里统一介绍一下它们。 首先&#xff0c;所有雷达的原理都是发射波&#xff0c;接收回波&#xff08;可能是声波或电磁波&#xff09;&#xff0c;并通过发射和接收的时间差以及波的速度计算距离。只不过发射的…...

Web 3.0 是什么

第 1 章 明晰Web 3.0 从本章开始,就进入了本书的第一篇章,入门Web3.0,在第一篇章中将会让读者对Web3.0有一个整体的认知,为学习后面的章节打下基础。 在本章中,主要介绍的是Web的发展历史,包涵Web1.0、Web2.0、Web3.0的发展过程,以及资本为什么需要入场Web3.0、Web3.0…...

四种NAT的网络结构

四种NAT的网络结构 引言1 完全圆锥型NAT2 IP限制圆锥型NAT3 Port限制圆锥型NAT4 对称型NAT5 总结 引言 NAT是将内网地址映射转换为外网地址的一种地址转换方式&#xff0c;这节省了有限的IP地址资源。一般来讲&#xff0c;分为对称型NAT和圆锥形NAT&#xff0c;其中圆锥形NAT又…...

Android studio 使用greenDao根据实体类生成dao类

1.遇到的问题 使用android studio根据实体类生成dao其实也很简单&#xff0c;你只要实现 Parcelable Entity public class ConfigDataModel implements Parcelable {Id(autoincrement true)private Long id null; } 2.使用自带的方法生成 使用build-->make Project生成 …...

redis 从0到1完整学习 (九):SkipList 数据结构

文章目录 1. 引言2. redis 源码下载3. skipList 数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;redis 常用命令》 《re…...

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金豺算法4.实验参数设定5.算法结果6.参考文献7.MA…...

Isaac Sim 仿真机器人urdf文件导入

本教程展示如何在 Omniverse Isaac Sim 中导入 urdf 一. 使用内置插件导入urdf 安装urdf 插件 方法是转到“window”->“Extensions” 搜索框中输入urdf, 并启用 通过转至Isaac Utils -> Workflows -> URDF Importer菜单来访问 urdf 扩展。 表格中的 1,2,3 对应着…...

Python 实现Excel和CSV之间的相互转换

通过使用Python编程语言&#xff0c;编写脚本来自动化Excel和CSV之间的转换过程&#xff0c;可以批量处理大量文件&#xff0c;定期更新数据&#xff0c;并集成转换过程到自动化工作流程中。本文将介绍如何使用第三方库Spire.XLS for Python 实现&#xff1a; 使用Python将Exc…...

【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南

前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信&#xff0c;通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内&#xff0c;SMSBoom 可以作为一种有效的测试工具&#xff0c;帮助开发者和系统…...

【Filament】立方体贴图(6张图)

1 前言 本文通过一个立方体贴图的例子&#xff0c;讲解三维纹理贴图&#xff08;子网格贴图&#xff09;的应用&#xff0c;案例中使用 6 张不同的图片给立方体贴图&#xff0c;图片如下。 读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角…...

SpringBoot 3.2.0 结合Redisson接入Redis

依赖版本 JDK 17 Spring Boot 3.2.0 Redisson 3.25.0 工程源码&#xff1a;Gitee 集成Redis步骤 导入依赖 <properties><redisson.version>3.25.0</redisson.version> </properties> <dependencies><dependency><groupId>org.pr…...

C++ 比C语言增加的新特性 5 之字符串string

1. c 的string类型 1.1 创建和初始化字符串 string.cpp #include "iostream" #include <string>using namespace std;//创建和初始化字符串 int main() {// 初始化空字符串string emptyString;// 使用字符串字面量初始化字符串string greeting "hello, …...

【第2讲】原理介绍和权限开通

系列文章目录 第1讲:Python环境的下载和安装第2讲:免费开通权限第3讲:1行代码,自动发正文第4讲:1行代码,自动发正文+附件第5讲:自动批量发送第6讲:1行代码,自动下载邮件的附件提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录…...

C++ opencv-3.4.1 提取不规则物体的轮廓

在学习opencv的时候&#xff0c;对一张照片&#xff0c;需要标注照片上物体的不规则轮廓。 如图: 使用opencv进行物体的轮廓处理&#xff0c;关键在于对照片的理解&#xff0c;前期的照片处理的越好最后调用api出来的结果就越接近理想值。 提取照片中物体分如下三步&#xff…...

ServletConfig对象.

是什么 ServletConfig是javax.servlet.包下的一个接口&#xff0c;ServletConfig它是Servlet的一个配置对象&#xff1b; ServletConfig是由tomcat容器创建&#xff0c;通过init方法传入给Servlet&#xff1b; ServletConfig对象如何获取? 在GenericServlet里面定义了&#x…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...