1. junit5介绍
JUnit 5 是 Java 生态中最流行的单元测试框架,由 JUnit Platform、JUnit Jupiter 和 JUnit Vintage 三个子项目组成。以下是 JUnit 5 的全面使用指南及示例:
一、环境配置
1. Maven 依赖
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.3</version><scope>test</scope>
</dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.3</version><scope>test</scope>
</dependency>
2. Gradle 依赖
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.3'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.3'
二、核心注解
| 注解 | 说明 |
|---|---|
@Test | 标记测试方法 |
@BeforeEach | 每个测试方法执行前运行 |
@AfterEach | 每个测试方法执行后运行 |
@BeforeAll | 所有测试方法执行前运行(静态方法) |
@AfterAll | 所有测试方法执行后运行(静态方法) |
@DisplayName | 自定义测试类或方法的显示名称 |
@Disabled | 禁用测试方法或类 |
@Nested | 定义嵌套测试类 |
示例
import org.junit.jupiter.api.*;class CoreAnnotationsTest {@BeforeAllstatic void initAll() {System.out.println("初始化全局资源");}@BeforeEachvoid init() {System.out.println("初始化测试资源");}@Test@DisplayName("测试加法")void testAddition() {Assertions.assertEquals(4, 2 + 2);}@AfterEachvoid tearDown() {System.out.println("清理测试资源");}@AfterAllstatic void tearDownAll() {System.out.println("清理全局资源");}
}
三、断言(Assertions)
JUnit 5 提供丰富的断言方法:
1. 基本断言
@Test
void basicAssertions() {// 相等性断言Assertions.assertEquals(4, 2 + 2);// 布尔断言Assertions.assertTrue(5 > 3);Assertions.assertFalse(3 > 5);// 空值断言String str = null;Assertions.assertNull(str);
}
2. 组合断言(Grouped Assertions)
@Test
void groupedAssertions() {String name = "John";Assertions.assertAll("组合断言",() -> Assertions.assertEquals("John", name),() -> Assertions.assertTrue(name.startsWith("J")));
}
3. 异常断言
@Test
void exceptionTesting() {Exception exception = Assertions.assertThrows(ArithmeticException.class,() -> { int result = 1 / 0; });Assertions.assertEquals("/ by zero", exception.getMessage());
}
四、参数化测试
使用 @ParameterizedTest 和不同的参数来源。
1. 添加依赖
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.3</version><scope>test</scope>
</dependency>
2. 示例
@ParameterizedTest
@ValueSource(ints = {1, 3, 5, 7})
void testOddNumbers(int number) {Assertions.assertTrue(number % 2 != 0);
}@ParameterizedTest
@CsvSource({"2, 3, 5", "5, 5, 10"})
void testAddition(int a, int b, int expected) {Assertions.assertEquals(expected, a + b);
}
五、嵌套测试
使用 @Nested 组织测试类结构:
class NestedTest {@Nestedclass WhenNew {@Testvoid testInitialState() {Assertions.assertTrue(true);}}@Nestedclass AfterAction {@Testvoid testAfterAction() {Assertions.assertFalse(false);}}
}
六、动态测试
运行时生成测试用例:
@TestFactory
Stream<DynamicTest> dynamicTests() {return Stream.of(DynamicTest.dynamicTest("动态测试1", () -> Assertions.assertTrue(true)),DynamicTest.dynamicTest("动态测试2", () -> Assertions.assertEquals(4, 2 + 2)));
}
七、超时测试
@Test
@Timeout(1) // 1秒超时
void testTimeout() throws InterruptedException {Thread.sleep(500); // 测试通过
}
八、扩展模型(Extension)
通过 @ExtendWith 自定义扩展:
class MyExtension implements BeforeEachCallback {@Overridepublic void beforeEach(ExtensionContext context) {System.out.println("自定义扩展逻辑");}
}@ExtendWith(MyExtension.class)
class ExtensionTest {@Testvoid testWithExtension() {Assertions.assertTrue(true);}
}
九、测试生命周期
JUnit 5 生命周期顺序:
@BeforeAll@BeforeEach@Test@AfterEach@AfterAll
十、测试执行顺序
默认顺序是随机的,可通过 @TestMethodOrder 指定顺序:
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderedTest {@Test@Order(1)void firstTest() {System.out.println("第一个测试");}@Test@Order(2)void secondTest() {System.out.println("第二个测试");}
}
总结
JUnit 5 提供了现代化的测试功能,包括参数化测试、动态测试、嵌套测试等。通过合理使用注解和断言,可以编写清晰、灵活的单元测试。更多高级用法可参考 JUnit 5 官方文档。
相关文章:
1. junit5介绍
JUnit 5 是 Java 生态中最流行的单元测试框架,由 JUnit Platform、JUnit Jupiter 和 JUnit Vintage 三个子项目组成。以下是 JUnit 5 的全面使用指南及示例: 一、环境配置 1. Maven 依赖 <dependency><groupId>org.junit.jupiter</grou…...
(脚本学习)BUU18 [CISCN2019 华北赛区 Day2 Web1]Hack World1
自用 题目 考虑是不是布尔盲注,如何测试:用"1^1^11 1^0^10,就像是真真真等于真,真假真等于假"这个测试 SQL布尔盲注脚本1 import requestsurl "http://8e4a9bf2-c055-4680-91fd-5b969ebc209e.node5.buuoj.cn…...
Caxa 二次开发 ObjectCRX-1 踩坑:环境配置以及 Helloworld
绝了,坑是真 nm 的多,官方给的文档里到处都是坑。 用的环境 ObjectCRX,以下简称 objcrx。 #1 安装环境 & 参考文档的大坑 #1.1 Caxa 提供的文档和环境安装包 首先一定要跟 Caxa 对应版本的帮助里提供的 ObjectCRX 安装器 (wizard) 匹配…...
【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用
文章目录 介绍GloVe 介绍核心思想共现矩阵1. 共现矩阵的定义2. 共现概率矩阵的定义3. 共现概率矩阵的意义4. 共现概率矩阵的构建步骤5. 共现概率矩阵的应用6. 示例7. 优缺点优点缺点 **总结** 目标函数训练过程使用预训练的GloVe词向量 优点应用总结 个人主页:道友老…...
bable-预设
babel 有多种预设,最常见的预设是 babel/preset-env,它可以让你使用最新的 JS 语法,而无需针对每种语法转换设置具体的插件。 babel/preset-env 预设 安装 npm i -D babel/preset-env配置 .babelrc 文件 在根目录下新建 .babelrc 文件&a…...
回顾生化之父三上真司的游戏思想
1. 放养式野蛮成长路线,开创生存恐怖类型 三上进入capcom后,没有培训,没有师傅手把手的指导,而是每天摸索写策划书,老员工给出不行的评语后,扔掉旧的重写新的。 然后突然就成为游戏总监,进入开…...
无公网IP 外网访问青龙面板
青龙面板是一款基于 Docker 的自动化管理平台,用户可以通过简便的 Web 界面,轻松的添加、管理和监控各种自动化任务。而且这款面板还支持多用户、多任务、任务依赖和日志监控,个人和团队都比较适合使用。 本文将详细的介绍如何用 Docker 在本…...
中国证券基本知识汇总
中国证券市场是一个多层次、多领域的市场,涉及到各种金融工具、交易方式、市场参与者等内容。以下是中国证券基本知识的汇总: 1. 证券市场概述 证券市场:是指买卖证券(如股票、债券、基金等)的市场。证券市场可以分为…...
C基础寒假练习(2)
一、输出3-100以内的完美数,(完美数:因子和(因子不包含自身)数本身 #include <stdio.h>// 函数声明 int isPerfectNumber(int num);int main() {printf("3-100以内的完美数有:\n");for (int i 3; i < 100; i){if (isPerfectNumber…...
Baklib如何提升内容中台智能化推荐系统的精准服务与用户体验
内容概要 在数字化转型的浪潮中,内容中台的智能化推荐系统成为提升用户体验的重要工具。Baklib作为行业领先者,在这一领域积极探索,推出了具有前瞻性的解决方案,旨在提高内容的匹配度和推荐的精准性。本文将深入探讨Baklib如何通…...
【Java】位图 布隆过滤器
位图 初识位图 位图, 实际上就是将二进制位作为哈希表的一个个哈希桶的数据结构, 由于二进制位只能表示 0 和 1, 因此通常用于表示数据是否存在. 如下图所示, 这个位图就用于标识 0 ~ 14 中有什么数字存在 可以看到, 我们这里相当于是把下标作为了 key-value 的一员. 但是这…...
【专业标题】数字时代的影像保卫战:照片误删拯救全指南
在智能手机普及率达98%的今天,每个人的数字相册都承载着价值连城的记忆资产。照片误删事件却如同数字时代的隐形杀手,全球每分钟有超过5000张珍贵影像因此消失。当我们发现重要照片不翼而飞时,那种心脏骤停般的恐慌感,正是数据时代…...
深度剖析八大排序算法
欢迎并且感谢大家指出我的问题,由于本人水平有限,有些内容写的不是很全面,只是把比较实用的东西给写下来,如果有写的不对的地方,还希望各路大牛多多指教!谢谢大家!🥰 在计算机科学领…...
JVM_程序计数器的作用、特点、线程私有、本地方法的概述
①. 程序计数器 ①. 作用 (是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令) ②. 特点(是线程私有的 、不会存在内存溢出) ③. 注意:在物理上实现程序计数器是在寄存器实现的,整个cpu中最快的一个执行单元 ④. 它是唯一一个在java虚拟机规…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.20 傅里叶变换:从时域到频域的算法实现
2.20 傅里叶变换:从时域到频域的算法实现 目录 #mermaid-svg-zrRqIme9IEqP6JJE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zrRqIme9IEqP6JJE .error-icon{fill:#552222;}#mermaid-svg-zrRqIme9IEqP…...
PAT甲级1052、Linked LIst Sorting
题目 A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the stru…...
git error: invalid path
git clone GitHub - guanpengchn/awesome-books: :books: 开发者推荐阅读的书籍 在windows上想把这个仓库拉取下来,发现本地git仓库创建 但只有一个.git隐藏文件夹,其他文件都处于删除状态。 问题: Cloning into awesome-books... remote:…...
优选算法合集————双指针(专题二)
好久都没给大家带来算法专题啦,今天给大家带来滑动窗口专题的训练 题目一:长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …...
Ubuntu下Tkinter绑定数字小键盘上的回车键(PySide6类似)
设计了一个tkinter程序,在Win下绑定回车键,直接绑定"<Return>"就可以使用主键盘和小键盘的回车键直接“提交”,到了ubuntu下就不行了。经过搜索,发现ubuntu下主键盘和数字小键盘的回车键,名称不一样。…...
使用arcpy列表函数
本节将以ListFeatureClasses()为例,学习如何使用arcpy中的列表函数. 操作方法: 1.打开IDLE,新建脚本窗口 2.导入arcpy模块 3.设置工作空间 arcpy.env.workspace "<>" 4.调用ListFeatureClasses()函数,并将返回的值赋值给fcList变量 fcList arcpy.ListFe…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
