Java Junit框架
JUnit 是一个广泛使用的 Java 单元测试框架,用于编写和运行可重复的测试。它是 xUnit 家族的一部分,专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码,确保代码的正确性和稳定性。
JUnit 的主要特点
- 注解驱动:JUnit 使用注解来标识测试方法、测试类、前置条件、后置条件等。
- 断言机制:JUnit 提供了一系列的断言方法(如
assertEquals,assertTrue,assertNull等),用于验证测试结果是否符合预期。 - 测试套件:可以将多个测试类组合成一个测试套件,方便批量执行。
- 参数化测试:支持通过参数化测试来运行同一测试方法多次,每次使用不同的输入数据。
- 异常测试:可以测试代码是否抛出了预期的异常。
- 生命周期管理:提供了
@Before,@After,@BeforeClass,@AfterClass等注解,用于管理测试的生命周期。
JUnit 的基本用法
1. 引入依赖
如果你使用 Maven 构建项目,可以在 pom.xml 中添加 JUnit 依赖:
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.1</version><scope>test</scope>
</dependency>
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.8.1</version><scope>test</scope>
</dependency>
2. 编写测试类
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;class MyTest {@BeforeAllstatic void setUpAll() {// 在所有测试方法之前执行一次System.out.println("BeforeAll");}@BeforeEachvoid setUp() {// 在每个测试方法之前执行System.out.println("BeforeEach");}@Testvoid testMethod1() {// 测试方法1assertEquals(2, 1 + 1);}@Testvoid testMethod2() {// 测试方法2assertTrue(3 > 2);}@AfterEachvoid tearDown() {// 在每个测试方法之后执行System.out.println("AfterEach");}@AfterAllstatic void tearDownAll() {// 在所有测试方法之后执行一次System.out.println("AfterAll");}
}
3. 运行测试
你可以使用 IDE(如 IntelliJ IDEA、Eclipse)或命令行工具(如 Maven、Gradle)来运行测试。
JUnit 注解
@Test:标识一个方法为测试方法。@BeforeAll:在所有测试方法之前执行一次,通常用于初始化资源。@AfterAll:在所有测试方法之后执行一次,通常用于释放资源。@BeforeEach:在每个测试方法之前执行,通常用于准备测试环境。@AfterEach:在每个测试方法之后执行,通常用于清理测试环境。@Disabled:禁用某个测试方法或测试类。@DisplayName:为测试方法或测试类指定一个自定义的名称。@ParameterizedTest:标识一个参数化测试方法。@RepeatedTest:标识一个重复执行的测试方法。
JUnit 断言
JUnit 提供了多种断言方法来验证测试结果:
assertEquals(expected, actual):验证两个值是否相等。assertNotEquals(unexpected, actual):验证两个值是否不相等。assertTrue(condition):验证条件是否为真。assertFalse(condition):验证条件是否为假。assertNull(object):验证对象是否为null。assertNotNull(object):验证对象是否不为null。assertThrows(expectedType, executable):验证是否抛出了指定类型的异常。
JUnit 5 与 JUnit 4 的区别
JUnit 5 是 JUnit 的最新版本,与 JUnit 4 相比,它引入了许多新特性:
- 模块化架构:JUnit 5 由多个模块组成,如
junit-jupiter-api,junit-jupiter-engine,junit-platform-runner等。 - 新的注解:如
@BeforeAll,@AfterAll,@DisplayName等。 - 扩展模型:JUnit 5 引入了扩展模型,允许开发者通过自定义扩展来增强测试功能。
- 参数化测试:JUnit 5 提供了更强大的参数化测试支持。
- 动态测试:允许在运行时生成测试用例。
4. JUnit 5 的高级特性
4.1 参数化测试
参数化测试允许你使用不同的输入数据运行同一个测试方法。
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.*;class ParameterizedTestExample {@ParameterizedTest@ValueSource(ints = {1, 2, 3})void testWithValueSource(int number) {assertTrue(number > 0);}
}
4.2 动态测试
动态测试允许在运行时生成测试用例。
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;class DynamicTestExample {@TestFactoryStream<DynamicTest> dynamicTests() {return Stream.of(dynamicTest("1 + 1 = 2", () -> assertEquals(2, 1 + 1)),dynamicTest("3 > 2", () -> assertTrue(3 > 2)));}
}
4.3 禁用测试
使用 @Disabled 注解可以禁用某个测试方法或测试类。
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;class DisabledTestExample {@Test@Disabled("暂时禁用这个测试")void disabledTest() {fail("这个测试被禁用了,不应该执行");}
}
4.4 自定义测试名称
使用 @DisplayName 注解可以为测试方法或测试类指定一个自定义的名称。
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;@DisplayName("自定义测试类名称")
class DisplayNameTestExample {@Test@DisplayName("自定义测试方法名称")void customTestName() {assertEquals(2, 1 + 1);}
}
总结
JUnit 5 提供了丰富的功能和灵活的语法,能够满足大多数 Java 项目的单元测试需求。通过掌握核心注解、断言方法以及高级特性(如参数化测试和动态测试),你可以编写出高效、可维护的测试代码。无论是新手还是经验丰富的开发者,JUnit 都是一个不可或缺的工具。
相关文章:
Java Junit框架
JUnit 是一个广泛使用的 Java 单元测试框架,用于编写和运行可重复的测试。它是 xUnit 家族的一部分,专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码,确保代码的正确性和稳定性。 JUnit 的主要特点 注解驱动&…...
3-3 WPS JS宏 遍历文件名获取函数(遍历指定文件夹下的所有工作)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
STM32CubeMx DRV8833驱动
一、DRV8833驱动原理 STBY口接单片机的IO口,STBY置0电机全部停止,置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。 AIN1AIN2电机状态00停止1speed反转speed1正转11停止 其中A端(AIN1与AIN2)只能控制AO1与…...
用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较
文章目录 1. 非流式输出与流式输出概述2. 非流式输出2.1 代码实例12.2 代码实例2 3. 流式输出3.1 流式输出的定义和作用3.2 流式输出适用的场景3.3 流式输出的实现方式与实现技术3.4 代码实例33.5 代码实例4 4. 小结 1. 非流式输出与流式输出概述 大模型收到输入后并不是一次性…...
【Qt】ffmpeg照片提取、视频播放▲
目录 一、图像的成像原理: RGB成像原理: YUV成像原理: 二、多线程 三、ffmpeg解码(照片提取) 1.准备工作 (1)在工程文件夹里面新建三个文件夹 (2)在main函数中加…...
Vue+Elementui 全局配置el-table表格列宽可拖拽
1、需求分析 如何让表格列宽可以拖动 elementui的el-table如果想要列宽可以拖动的话 有一个属性叫 border 在模板里添加这个属性即可实现 但是系统里面的表格我不可能一个一个去添加border太麻烦 如果能够全局配置岂不是非常省时间吗 我们在main.js里面通过全局混入的方式来…...
SQL命令详解之增删改数据
目录 简介 1 添加数据 1.1 基础语法 1.2 SQL 练习 2 修改数据 2.1 基础语法 2.2 SQL 练习 3 删除数据 3.1 基础语法 3.2 SQL 练习 总结 简介 在数据库操作中,增、删、改是最基础的操作,它们通常对应着SQL中的INSERT、DELETE和UPDATE命令。…...
鸿蒙开发第4篇__关于在鸿蒙应用中使用Java语言进行设计
本博文对于鸿蒙APP程序员来说,很重要 HarmonyOS从 API8 开始不再支持使用Java作为开发语言,未来的新功能将在ArkTS中实现. API 8对应的是HarmonyOS 3.0.0版本, 2022年7月27日, 华为发布了HarmonyOS 3.0。 请看下图: 因此&#…...
Linux三种网络方式
前言 发现运维啥都得会,这周就遇到了网络问题自己无法解决,因此痛定思痛学一下。 参考文献 你管这破玩意叫网络? 桥接模式、NAT模式、仅主机模式,原来是这样工作的 交换机 构成局域网,实现所有设备之间的通信。 …...
计算机网络之传输层(传输层提供的服务)
一、可靠的数据传输 传输层提供可靠的数据传输服务,确保数据在传输过程中不丢失、不重复、不乱序,并且能够被正确接收。这通常通过面向连接的协议(如TCP)来实现,TCP通过确认、重传、序号等机制来保证数据传输的可靠性…...
Ubuntu 防火墙iptables和 ufw
文章目录 iptables 和 ufw 的区别Ubuntu 上使用 ufw 配置 iptables 和 ufw 的区别 iptables 和 ufw 是 Linux 系统中用于管理防火墙的工具,但它们的设计目标和使用方式有所不同。 iptables:功能强大,适合高级用户和复杂场景,但配…...
11天 -- Redis 中跳表的实现原理是什么?Redis 的 hash 是什么?Redis Zset 的实现原理是什么?
Redis 中跳表的实现原理是什么? Redis 中的跳表(Skip List)是一种基于有序链表的高效数据结构,通过在链表上增加多级索引来提高数据的查找效率。以下是 Redis 中跳表的实现原理: 1. 基本概念 节点结构:跳…...
JavaWeb——HTML
一、什么是HTML HTML(HyperText Markup Language):超文本标记语言 超文本:超越了文本的限制,比普通文本更强大。除了文字信息还可以定义图片,音频,视频等。标记语言:由标签构成的语言 HTML语言都是预定义好…...
Spring DIIoC
一.IoC 1.简介 什么是IoC?IoC,全称 Inversion of Control,控制反转。IoC是Spring的核心思想,Spring是⼀个“控制反转”的容器。 如果我们需要一个对象,正常来说我们是通过new一个对象,这个时候我们依赖的…...
【前端基础】Day 2 CSS层叠样式表
目录 1.CSS简历 2.CSS 基础选择器 2.1标签选择器 2.2类选择器 2.3 id选择器 2.4通配符选择器 2.5总结 3.CSS字体属性 字体属性总结 4.CSS文本属性 4.1颜色 4.2对齐文本 4.3装饰文本 4.4文本缩进 4.5行间距 4.6文本属性总结 5.CSS的引入方式 5.1内部样式表 …...
建易WordPress
建易WordPress是一家专业的WordPress建站服务提供商,专注于为企业和个人提供一站式的WordPress网站建设、维护、托管、运营推广以及搜索引擎优化(SEO)服务。 服务内容 1. 网站建设 提供模板建站和定制开发两种服务,满足不同客户的需求。模板建站价格为…...
计算机毕业设计SpringBoot+Vue.js汽车资讯网站(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
nuxt常用组件库html-validator、@nuxtjs/i18n、@nuxt/image、@unocss/nuxt使用解析
html-validator 主要用于自动验证nuxt服务器呈现的HTML(SSR和SSG),以检测可能导致水合错误的HTML常见问题,有助于减少水合错误,检测常见的可访问性错误。 安装 npx nuxilatest module add html-validator配置 若自动更新nuxt.config.ts配置文…...
Leetcode-最大矩形(单调栈)
一、题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 输入:matrix [["1","0","1","0","0"],["1","0&…...
Vue核心知识:动态路由实现完整方案
在Vue中实现动态路由,并结合后端接口和数据库表设计,是一个复杂的项目,需要多个技术栈和步骤的配合。以下将详细描述整个实现过程,包括数据库设计、后端接口设计、前端路由配置以及如何实现动态路由的功能。 目录 一、需求分析二…...
【Docker】使用Docker搭建-MySQL数据库服务
零、更换Docker镜像源 因为国内现在封锁了Docker默认拉取镜像的站点(DockerHub),而且国内大部分Docker镜像站已全部下线,导致现在很多朋友在拉取镜像的时候会出现无法拉取的现象,这时候就需要进行更换Docker镜像源。 可…...
DHCP配置和地址
DHCP:动态主机配置协议 DHCP系统组成 DHCP报文结构 DHCP报文类型 DHCP工作流程 DHCP租期更新 DHCP重绑定 自动保留IP 租期设置建议 IP地址释放 DHCP地址池 DHCP配置 DHCP接口地址池配置 DHCP全局地址池配置...
基于trl复现DeepSeek-R1的GRPO训练过程
1. 引入 huggingface开发了强化学习训练Transformer的库trl(参考3),借助这个trl,可以用来做GRPO的强化学习训练。魔搭ModelScope社区的文章(参考2)给出了基于Qwen基座模型Qwen2.5-0.5B-Instruct࿰…...
常用的 pip 命令
pip 是 Python 的包管理工具,可用于安装、卸载、更新和管理 Python 包。以下是一些常用的 pip 命令: 1. 安装包 安装最新版本的包 pip install package_namepackage_name 是你要安装的 Python 包的名称,例如 pip install requests 可以安装…...
基于C#的CANoe CLR Adapter开发指南
一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具,它支持多种编程接口,方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互,充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…...
eMMC安全简介
1. 引言 术语“信息安全”涵盖多种不同的设计特性。一般而言, 信息安全是指通过实践防止信息遭受未经授权的访问、使用、披露、中断、篡改、检查、记录或销毁。 信息安全的三大核心目标为 机密性(Confidentiality)、完整性(Integr…...
从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(六) 导航栏 和 个人信息设置
1.导航栏(navbar) 在components下面 创建NavBar.jsx import { MessageSquare,Settings,User,LogOut} from "lucide-react" import {Link} from "react-router-dom" import { useAuthStore } from "../store/useAuthStore&qu…...
c#实现modbus rtu定时采集数据
以下是使用C#实现Modbus RTU定时采集数据的完整代码示例,包含定时任务、数据采集和异常处理: csharp 复制 using System; using System.IO.Ports; using System.Timers;public class ModbusRtuCollector : IDisposable {private readonly SerialPort _serialPort;private …...
【Python 语法】Python 数据结构
线性结构(Linear Structures)1. 顺序存储列表(List)元组(Tuple)字符串(String) 2. 线性存储栈(Stack)队列(Queue)双端队列(…...
数据库MySQL,在终端输入后,提示不是内部命令等
【解决问题】mysql提示不是内部或外部命令,也不是可运行的程序 一般这种问题是因为没有在系统变量里面添加MySQL的可执行路径 以下是添加可执行路径的方法: 第一步:winR输入services.msc 然后找到MySQL,右击属性并复制MySQL的可执…...
