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。
以下是一些原因:
-
更灵活的测试配置: TestNG 提供了更灵活的测试配置选项,可以通过 XML 文件进行配置,允许开发人员更细粒度地控制测试的执行方式,包括并发测试、测试组、测试套件等。
-
注解的丰富性: TestNG 提供了更多的注解,例如
@BeforeSuite
、@AfterSuite
、@BeforeTest
、@AfterTest
等,使测试方法的组织更加灵活。TestNG 的注解支持更丰富的测试生命周期管理。 -
参数化测试: TestNG 提供了更强大的参数化测试支持,通过
@DataProvider
注解,可以更轻松地实现数据驱动测试。 -
依赖测试: TestNG 具有更强大的依赖测试支持,可以通过
dependsOnMethods
或dependsOnGroups
属性指定测试方法之间的依赖关系,确保测试方法按照指定的顺序执行。 -
测试分组和套件: TestNG 提供了更灵活的测试分组和测试套件功能,可以按照不同的维度组织测试,更容易管理和执行特定组的测试。
-
并发测试: TestNG 内置支持并发测试,可以配置测试套件中的测试以并行执行,提高测试效率。
-
监听器支持: TestNG 提供了丰富的监听器接口,可以通过实现这些接口定制测试执行期间的行为,例如,在测试开始或结束时执行一些操作。
-
软断言(Soft Assertions): TestNG 支持软断言,即使在断言失败时,测试方法仍然会继续执行,方便查看所有断言失败的情况。
-
跳过测试: TestNG 允许在测试方法上使用
@Test(enabled = false)
来标记测试方法为禁用状态,而不需要注释掉整个方法。
junit/junit5/testNG 等常见 java 测试框架的对比
功能/特性 | JUnit 4 | JUnit 5 | TestNG |
---|---|---|---|
注解 | @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 属性指定测试方法的依赖关系 | 使用 dependsOnMethods 或 dependsOnGroups 属性指定测试方法或测试组之间的依赖关系 |
并发测试 | 不直接支持并发测试 | 支持并发测试,可以配置测试类或测试方法并发执行 | 支持并发测试,可以在测试套件或测试方法级别设置并发数 |
测试分组 | 通过命名规则或自定义注解进行分组 | 使用 @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 项目依赖仓库配置详解:pom.xml 中的 repositories 与 Maven 配置文件的调用顺序 Maven(Apache Maven)是一个流行的项目管理工具,广泛用于Java项目的构建、依赖管理以及项目生命周期的管理。在Maven项目中,pom.x…...
JS深浅拷贝
区分 B复制了A的值,如果A被修改,B的值也被改变,那就是浅拷贝。 如果B的值没有跟着修改,那就是深拷贝 深浅拷贝的方式 1、遍历赋值 2、Object.create() 3、JSON.parse()和JSON.stringify() 浅拷贝-遍历 let a {name:"…...

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

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

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

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是将内网地址映射转换为外网地址的一种地址转换方式,这节省了有限的IP地址资源。一般来讲,分为对称型NAT和圆锥形NAT,其中圆锥形NAT又…...

Android studio 使用greenDao根据实体类生成dao类
1.遇到的问题 使用android studio根据实体类生成dao其实也很简单,你只要实现 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. 引言 前情提要: 《redis 从0到1完整学习 (一):安装&初识 redis》 《redis 从0到1完整学习 (二):redis 常用命令》 《re…...

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金豺算法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编程语言,编写脚本来自动化Excel和CSV之间的转换过程,可以批量处理大量文件,定期更新数据,并集成转换过程到自动化工作流程中。本文将介绍如何使用第三方库Spire.XLS for Python 实现: 使用Python将Exc…...

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

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

SpringBoot 3.2.0 结合Redisson接入Redis
依赖版本 JDK 17 Spring Boot 3.2.0 Redisson 3.25.0 工程源码: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的时候,对一张照片,需要标注照片上物体的不规则轮廓。 如图: 使用opencv进行物体的轮廓处理,关键在于对照片的理解,前期的照片处理的越好最后调用api出来的结果就越接近理想值。 提取照片中物体分如下三步ÿ…...

ServletConfig对象.
是什么 ServletConfig是javax.servlet.包下的一个接口,ServletConfig它是Servlet的一个配置对象; ServletConfig是由tomcat容器创建,通过init方法传入给Servlet; ServletConfig对象如何获取? 在GenericServlet里面定义了&#x…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...