深入了解JUnit 5:新一代Java单元测试框架
深入了解JUnit 5:新一代Java单元测试框架
近年来,Java领域的单元测试框架发展迅速,而JUnit 5作为JUnit系列的最新版本,为开发人员提供了更多的功能和灵活性。在本文中,我们将介绍JUnit 5,并探讨其与JUnit 4的区别,以及详细介绍JUnit 5中各种注解的作用及使用方法。
JUnit 5简介
JUnit 5是Java领域最流行的单元测试框架之一,它引入了许多新的功能和改进,旨在提高测试代码的质量和可维护性。与JUnit 4相比,JUnit 5具有更灵活的架构和更丰富的功能,使得编写和执行测试用例更加便捷和高效。
JUnit 5与JUnit 4的区别
-
架构变化:JUnit 5采用了模块化的架构,核心模块分为JUnit Platform、JUnit Jupiter和JUnit Vintage。这种模块化的设计使得JUnit 5更加灵活,可以更轻松地扩展和集成其他测试框架。
-
注解改变:JUnit 5引入了一系列新的注解,用于定义测试方法、断言和扩展等。相比之下,JUnit 4的注解相对较少,功能也相对单一。
-
扩展机制:JUnit 5的扩展机制更加强大,可以通过自定义扩展来实现各种功能,例如参数化测试、条件测试等。这种扩展机制为开发人员提供了更多的灵活性和可定制性。
JUnit 5注解详解及使用方法
1. @Test
@Test
注解用于标识测试方法,JUnit 5中的测试方法可以使用任何可见性修饰符,并且不再强制要求方法名称以"test"开头。
import org.junit.jupiter.api.Test;public class MyTestClass {@Testvoid myTestMethod() {// 测试代码}
}
2. @BeforeEach
和 @AfterEach
@BeforeEach
和@AfterEach
注解用于在每个测试方法执行之前和之后执行一些准备和清理工作。
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.AfterEach;public class MyTestClass {@BeforeEachvoid setUp() {// 执行每个测试方法之前的准备工作}@AfterEachvoid tearDown() {// 执行每个测试方法之后的清理工作}
}
3. @BeforeAll
和 @AfterAll
@BeforeAll
和@AfterAll
注解用于在所有测试方法执行之前和之后执行一次性的准备和清理工作。
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.AfterAll;public class MyTestClass {@BeforeAllstatic void setUp() {// 执行所有测试方法之前的准备工作}@AfterAllstatic void tearDown() {// 执行所有测试方法之后的清理工作}
}
4. @DisplayName
@DisplayName
注解用于为测试类或测试方法指定自定义的显示名称,方便识别和理解测试结果。
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;@DisplayName("My Test Class")
public class MyTestClass {@Test@DisplayName("My Test Method")void myTestMethod() {// 测试代码}
}
5. @Disabled
@Disabled
注解用于标识测试类或测试方法为禁用状态,即不会被执行。
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;@Disabled
public class MyDisabledTestClass {@Testvoid myDisabledTestMethod() {// 不会被执行的测试方法}
}
6. @Nested
@Nested
注解用于创建内部测试类,使得测试类的组织结构更加清晰。通过嵌套测试类,可以更好地组织和管理相关的测试方法。
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;public class OuterTestClass {@Nestedclass InnerTestClass {@Testvoid testMethod() {assertEquals(2, 1 + 1);}}
}
7. @ParameterizedTest
@ParameterizedTest
注解用于执行参数化测试,允许在不同的参数组合下多次运行相同的测试方法。
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.assertTrue;public class ParameterizedTestExample {@ParameterizedTest@ValueSource(ints = {1, 2, 3})void testMethod(int number) {assertTrue(number > 0 && number < 4);}
}
8. @RepeatedTest
@RepeatedTest
注解用于重复执行相同的测试方法指定次数。
import org.junit.jupiter.api.RepeatedTest;
import static org.junit.jupiter.api.Assertions.assertTrue;public class RepeatedTestExample {@RepeatedTest(3)void testMethod() {assertTrue(true);}
}
9. @Tag
@Tag
注解用于为测试类或测试方法添加标签,可以根据标签对测试进行分组,方便选择性地执行某些测试。
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;@Tag("fast")
public class TaggedTest {@Test@Tag("smoke")void smokeTest() {assertTrue(true);}@Testvoid fastTest() {assertTrue(true);}
}
10. @DisplayNameGeneration
@DisplayNameGeneration
注解用于指定测试类的显示名称生成策略,可以通过实现DisplayNameGenerator
接口来自定义显示名称的生成规则。
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class DisplayNameGenerationExample {// Test methods with underscores replaced by spaces in display name
}
总结
通过本文的介绍,我们了解了JUnit 5的特点、与JUnit 4的区别,以及JUnit 5中各种注解的作用及使用方法。JUnit 5作为一款现代化的Java单元测试框架,为开发人员提供了更多的功能和灵活性,帮助他们编写高质量的测试代码,提升软件质量和开发效率。
希望本文能够对您理解和使用JUnit 5有所帮助,谢谢阅读!
相关文章:
深入了解JUnit 5:新一代Java单元测试框架
深入了解JUnit 5:新一代Java单元测试框架 近年来,Java领域的单元测试框架发展迅速,而JUnit 5作为JUnit系列的最新版本,为开发人员提供了更多的功能和灵活性。在本文中,我们将介绍JUnit 5,并探讨其与JUnit 4…...
2024年清明节安装matlab 2024a
下载安装离线支持包SupportSoftwareDownloader_R2024a_win64,地址https://ww2.mathworks.cn/support/install/support-software-downloader.html,运行软件(自解压运行),登录账号(需要提前在官网注册&#x…...
关于PostgreSQL JDBC中的log输出是怎么回事?
微信公众号:数据库杂记 个人微信: _iihero 我是iihero. 也可以叫我Sean. iihero@CSDN(https://blog.csdn.net/iihero) Sean@墨天轮 (https://www.modb.pro/u/16258) 数据库领域的资深爱好者一枚。SAP数据库技术专家与架构师,PostgreSQL ACE. 水木早期数据库论坛发起人db2@…...
【科研笔记】知识星球不可选择内容爬虫
知识星球不可选择内容爬虫 1 背景2 实现3 拓展遗留问题1 背景 针对与知识星球中,电脑打开网页不可选择复制粘贴的问题,进行爬虫处理,获取网页的内容,并保存在本地 2 实现 需要下载python,和爬虫的第三方库selenium,可以查看博客中有关selenium的内容进行回顾。当前使用…...
[技术闲聊]我对电路设计的理解(二)
第一篇文章 [技术闲聊]我对电路设计的理解(一),看着是述说着应届生如何对待一份工作,其实也是我在过往以及以目前视野看过往的事情,自己的一种态度。谦虚,是一个不可多得的词汇,因为刚起步,学习的东西很多&…...
【Android、 kotlin】kotlin学习笔记
基本语法 fun main(){val a2var b "Hello"println("$ (a - 1} $b Kotlin!")} Variables 只赋值一次用val read-only variables with val 赋值多次用var mutable variables with var Standard output printin() and print() functions String templ…...
Debian 配置国内软件源
为什么需要? Debian安装好之后默认是没有软件源的,只能通过本身的光盘上的软件进行安装,这样明显是不能够满足我们的需要的,考虑到国内的上网速度以及环境,配置一个国内的阿里镜像源是最好的选择。 使用 sudo vim /…...
选数(dfs,isprime)
题目:P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; int n,k; int a[22]; long long ans; bool isprime(int n){for(int i2;i<sqrt(n);i){if(n%i0) return false;…...
RocketMQ(版本4.9.4)+RocketMQ_Dashbord环境搭建(生产者、消费者的前置环境搭建)
一、官方网站下载 RocketMQ源码包 https://rocketmq.apache.org/zh/docs/4.x/introduction/02quickstart 二、把rocketMQ上传到Linux环境下解压,编译,执行以下命令(需要提前装jdk和maven并配置好环境变量) unzip rocketmq-all-4…...
css隐藏溢出隐藏的滚动条
msOverflowStyle: none: 这个属性用于在 Internet Explorer 浏览器中定义滚动条的样式。将其设置为 none 可以隐藏滚动条。 scrollbarWidth: none: 这个属性用于定义滚动条的宽度。将其设置为 none 可以隐藏滚动条。这个属性在一些新的浏览器中被支持,如 Firefox。…...
scss常用混入(mixin)、@inclue
mixin和inclue的基本使用 mixin混入可以用于定义重复使用的样式,比如下面CSS代码 .header {display: flex;justify-content: center;align-items: center;width: 500px;height: 100px; }.footer {display: flex;justify-content: center;align-items: center;width…...
补代码随想录算法训练营第44天 | 完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ
完全背包 视频讲解:带你学透完全背包问题! 和 01背包有什么差别?遍历顺序上有什么讲究?_哔哩哔哩_bilibili https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5…...
【Linux】网络基础常识{OSI七层模型/ TCP/IP / 端口号 /各种协议}
文章目录 1.网络常识1.0DHCP协议1. 1IP地址/MAC地址/ARP协议是什么?IP/MACARP:IP ⇒ MAC 1.2手机连接wifi的原理 SSID与BSSID手机连接wifiSSID与BSSID 1.3手机如何通过“数据/流量”上网?1.4电脑连接wifi的原理?电脑通过热点上网…...
python--面向对象编程和类的定义,对象的创建
一、面向对象简介 1、什么是面向对象 面向对象是一种编程思想,把数据和对数据的多个操作方法封装在一起组成类,这样通过这个类创建出来的对象,就可以直接调用这些方法了。 2、面向对象相关的术语 类:用来描述具有相同的属性和方法的对象的…...
nssm 工具把asp.net core mvc变成 windows服务,使用nginx反向代理访问
nssm工具的作用:把项目部署成Windows服务,可以在系统后台运行 1.创建一个asp.net core mvc的项目weblication1 asp.net core mvc项目要成为windows服务需要安装下面的nuget包 <ItemGroup><PackageReference Include"Microsoft.Extension…...
String Encryptor custom Bean not found with name ‘jasyptStringEncryptor‘...
项目采用 spring boot 2.6.13 jasypt-spring-boot-starter 3.0.5 apollo-client 1.6.0 自定义jasyptStringEncryptor,服务器上启动死活报找不到bean jasyptStringEncryptor,采用默认的,密文配置项自然解密失败导致服务无法启动。 经过一…...
FastAPI+React全栈开发14 FastAPI如何开发REST接口
Chapter03 Getting Started with FastAPI 14 How does FastAPI speak REST FastAPIReact全栈开发14 FastAPI如何开发REST接口 Let’s create a minial FastAPI application, a classic Hello World example, and start examining how FastAPI structures the endpoints. I u…...
在 DDD 中,如何处理领域对象的持久化?
在 DDD 中,领域对象的持久化工作通常是通过仓库 Repository 和工厂 Factory 实现的。仓库是一种用于访问领域对象的机制。他负责将领域对象从内存中保存到持久存储,如数据库中,以及从持久存储中检索领域对象。而工厂则负责从持久存储中组装领…...
centos 如何安装nvidia-container-runtime
在CentOS上安装nvidia-container-runtime,首先需要确保你的系统已经安装了NVIDIA的驱动和docker。以下是安装步骤: 确保Docker已安装: sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/lin…...
非写代码无以致远
标题党一下,本篇文章主要汇总了一些代码题,让大家写一些代码练习一下吧! 变种水仙花_牛客题霸_牛客网 (nowcoder.com) #include<stdio.h> int main() {for (int i 10000; i < 99999; i) {int sum 0;for (int j 10; j < 1000…...
刷题之Leetcode34题(超级详细)
34. 在排序数组中查找元素的第一个和最后一个位置 力扣链接(opens new window)https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/ 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始…...
从0到1构建uniapp应用-store状态管理
背景 在 UniApp的开发中,状态管理的目标是确保应用数据的一致性,提升用户体验,并简化开发者的工作流程。通过合理的状态管理,可以有效地处理用户交互、数据同步和界面更新等问题。 此文主要用store来管理用户的登陆信息。 重要…...
Uinx线程详解
目录 一.什么是线程? 并发(Concurrency) 并行(Parallelism) 1.1 线程的概念 1.2 线程的基本函数 1.3 线程的基本使用例子: 二.线程的属性 2.1线程属性使用例子 三.线程互斥 3.1互斥锁 3.2互斥锁常用函…...
线性代数笔记23--马尔可夫矩阵、傅里叶级数
1. 马尔可夫矩阵 例子 A [ . 1 . 001 . 3 . 2 . 099 . 3 . 7 0 . 4 ] A \begin{bmatrix} .1 & .001 & .3\\ .2 & .099 & .3\\ .7 & 0 & .4 \end{bmatrix} A .1.2.7.001.0990.3.3.4 马尔可夫矩阵满足条件 λ 1 为特征值 \lambda1为特征…...
Elasticsearch 压测实践总结
背景 搜索、ES运维场景离不开压力测试。 1.宿主机层面变更:参数调优 & 配置调整 & 硬件升级2.集群层面变更:参数调优3.索引层面变更:mapping调整 当然还有使用层面变更,使用API调优(不属于该文章的讨论范围…...
Spirngboot JWT快速配置和使用
2、JWT 2.1、JWT介绍 JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从…...
【Java SE】继承
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 继承1.1 继承是什么1.2 继承的意义1.3 继承的语法1.4 继承的方式1.5 子类中访问父类成员1.5.1 子类中访问…...
设计模式(19):策略模式
策略模式 策略模式对应与解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。 本质 分离算法,选择实现; 策略模式角色 上下…...
Linux 命令 top 详解
1 top命令介绍 Linux系统中,Top命令主要用于实时运行系统的监控,包括Linux内核管理的进程或者线程的资源占用情况。这个命令对所有正在运行的进程和系统负荷提供不断更新的概览信息,包括系统负载、CPU利用分布情况、内存使用、每个进程的内容…...
Android安卓开发 - 简单介绍(一)
最近呢需要重构还有维护安卓项目,所以最近会从零开始梳理开发的一些知识点以及开发的内容 前面已经写了安装的教程,idea怎么安装,还有官方的开发工具Android Studio怎么安装 2024最新版Android studio安装入门教程(非常详细&…...
英文网站建/软文广告图片
今天在刷题的时候用到了正则,用的过程中就感觉有点不太熟练了,很久没有用正则都有点忘了。所以现在呢,我们就一起来review一下python中正则模块re的用法吧。 今天是review,所以一些基础的概念就不做介绍了,先来看正则中…...
wordpress快速下载地址/软文撰写案例
1. 字符串大小写转换 string没有直接提供to_upper或to_lower这样的方法,不过有更通用的方法: std::string s("hello"); transform(s.begin(), s.end(), s.begin(), toupper); transform(s.begin(), s.end(), s.begin(), tolower);std::vecto…...
找个做网站的人/合肥网站维护公司
题目链接:491. 递增子序列 - 力扣(LeetCode)leetcode-cn.com题目描述:给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, …...
西安响应式网站开发/郑州手机网站建设
【实例简介】使用了SSM框架,并且分别结合html和jsp实现简单查询功能,并且也写入了增删改查的sql。非常简洁,适合新手入门学习【实例截图】【核心代码】SSMTest最终版└── SSMTest├── pom.xml├── src│ └── main│ ├── java…...
网站怎么做图片转换/seo的中文含义是什么意思
目录一、MySQL进阶查询1.1 常用查询1.1.1 按关键字排序1.1.2 对结果进行分组1.1.3 限制结果条目1.1.4 设置别名1.1.5 通配符1.1.6 子查询1.2 NULL值1.3 正则表达式1.3.1 以特定字符串开头的记录1.3.2 以特定字符串结尾的记录1.3.3 包含指定字符串的记录1.3.4 以“.”代替字符串…...
dz做电影网站/seo排名优化培训
文件上传这个我看来有两种上传方法:一、上传到服务器上把文件地址存入数据库中 二、直接把文件以字节数存储 第一种方式比较常见:可以使用文件流的形式把文件写入到服务器端。 今天主要说明第二种方法: 因为我做的是web项目,所以上…...