升级到JUnit5的7个理由

JUnit 5 新特性与最佳实践:从注解到扩展模型的全面升级 单元测试是保障软件质量的核心实践,它通过隔离验证代码单元的行为来确保其正确性。其基本原理是在隔离环境中执行代码片段,并断言其输出或行为符合预期,从而快速发现回归问题。在Java生态中,JUnit作为事实上的标准测试框架,其技术价值在于为开发者提供了一套标准化、可维护的测试编写范式。随着现代Java项目对模块化、扩展性及新语言特性支持的需求日益增长,JUnit 5应运而生,它彻底重构了架构,以全新的注解体系、强大的断言机制和灵活的扩展模型,更好地服务于Spring Boot集成、参数化测试等复杂应用场景。本文 阅读详情

最新版本的JUnit在2017年的第三季度已经发布了final release版本。大量的里程碑改进加入了新版本中。我希望你能够尽快的使用起来,这篇文章的主题,我列出了7个点,鼓励大家立刻开始去玩玩JUnit5.

立刻可用
当一门语言、一款应用服务器或代码库的新版本出现的时候,大部分开发人员往往会等到业界真正开始推行这个产品的时候,才开始选择学习。这种情况经常出现,看看JavaScript,在ES2015规范发布两年后,大部分主流Web浏览器仍在努力支持所有语言特征。虽然JS转化器在一定程度上推动了标准的实施,但是确实是饶了一个弯路。

JUnit5团队从一开始就考虑了新版本的这些问题。IntelliJ IDEA已经支持IDE中运行JUnit5测试,Eclipse也将支持JUnit5列入了其beta support列表中。两款最流行的构建工具,Maven和Gradle,已经支持JUnit5测试。如果你不熟悉这些流行的工具,JUnit5也提供了一款控制台工具帮你自动的运行JUnit5测试。就算这些都不成立,还有一个JUnit4的测试运行工具能够在JUnit4环境中测试新版本的测试代码。你看看,所有的配套都准备好了。

易于学习
第一眼看上去,新的API(新命名为JUnit Jupiter)和他的前身非常像。这个相似程度之高,甚至你会觉得这个新的版本就是新瓶装旧酒。包括最流行的那些断言方法也是一样的。唯一的区别就是放在了不同的包中,并且参数的顺序有了一些区别。一些JUnit4中的著名的注解修改了名字,但是作用都是差不多的。如果你对JUnit4比较熟悉,那么你要掌握JUnit5的基础使用,只需要几分钟。

这个时候,你可能会想,既然两个版本这么像,那为啥我还要升级呢?简单来说,JUnit5更像是JUnit4的一个超集,他提供了非常多的增强。

全新的功能
一旦你熟悉了JUnit5的基础内容,你可以顺利进入下一个阶段,根据你的需求,你可能会考虑以下几个进阶点:

新的断言
嵌套测试类 - 不仅仅是BDD(Behavior Driven Development)开发人员大力推崇
动态测试 - 在运行时生成测试用例
扩展测试 - 允许你重新定义测试的行为,允许你使用插件的形式重用你的测试类。
解决了前序版本的问题
没有完美的东西,JUnit4也一样。在JUnit4中,在社区中对几个大大小小的问题都有各种讨论和改进,我们来看看这些问题。

异常验证

异常检查可以说是JUnit4中一个标志性的问题。我们来考虑一下下面这个JUnit4测试:

@Test(expected = IllegalArgumentException.class)
public void shouldThrowException() throws Exception {
    Task task = buildTask();
    LocalDateTime oneHourAgo = LocalDateTime.now().minusHours(1);
    task.execute(oneHourAgo);
}

想象我们运行这个测试,如果传入到execute()方法中的参数是一个过去的时间,会正常抛出一个IllegalArgumentException异常。这种情况下,测试会运行的正确。但是如果在buildTask()方法中抛出一个异常呢?测试会正常执行,并且会提示你得到的异常和期望异常不匹配。这里,问题就出来了,我们只是希望测试在指定位置得到指定的异常,而不是在整个测试体中出现的异常,都作为对比异常。在JUnit5中,提供了一个assertThrows()方法,可以非常轻松的处理这个问题:

@Test
void shouldThrowException() throws Exception {
    Task task = buildTask();
    LocalDateTime oneHourAgo = LocalDateTime.now().minusHours(1);
    assertThrows(IllegalArgumentException.class,
                 () -> task.execute(oneHourAgo));
}

超时时间测试

额外的,添加了一组新的断言,用于在lambda样式断言中衡量代码超时时间,在这种情况下,就不会担心测试的setup阶段对代码执行时间的影响,你可以指定只去衡量某一段代码的执行时间。另外,还提供了一个选项,当已经出现超时的时候,你是选择停止应用执行或者是继续当前测试以衡量代码执行的真实完整时间。

@Test
void shouldTimeout() throws Exception {
    ExpensiveService service = setupService();
    assertTimeout(ofSeconds(3), () -> {
        service.expensiveMethod();
    });
}

参数化测试

在JUnit4中,如果想要实现参数化测试(使用不同的参数来测试相同的一个方法),只能使用测试类中的字段来实现,在JUnit5中,提供了参数化测试来实现这个需求。不同的参数值可以直接和一个测试方法关联,并且允许直接在一个测试类中提供不同的参数值直接参与测试,这些在JUnit4中,都是不可能实现的。

测试的参数可以通过一组CSV格式的字符串,外部的CSV文件,枚举,工厂方法,或者指定的提供类来提供。CSV中的字符串类型的值可以自动的转化为指定的类型,并且你可以完成自己的类型转换器,将String转成你希望的任何指定类型。

多运行器

JUnit4中最让人诟病的可能就是不能使用多个测试运行器测试。参数化测试或者嵌套测试的问题,可以通过测试运行器来解决,但问题是我们只能使用一个测试运行器。比如,在Spring4.2之前,每一个依赖于Spring上下文的测试都只能使用SpringJUnit4ClassRunner,在4.2之后,你可以使用专用的规则来(SpringClassRule)处理这个问题,允许你使用不同的测试运行器来运行测试,但是同一时间,仍然只能使用一次。JUnit4从一开始因为兼容问题,就根本没有设计运行器扩展的问题。JUnit 5团队选择了一条不同的路径,并计划了新版本的架构来解决这个问题。

迁移简单
到这里,你是否又担心在目前的项目中已经有上百个测试用例,为了获得JUnit5的好处,而不得不重写这些测试代码?请放松,JUnit5团队提供了多种升级的选择。第一点,你可以在一个项目中同时使用JUnit4和JUnit5,而不用担心出现冲突。当你添加新的JUnit依赖到项目中,有两种方式可以同时运行测试。

侵略性最小的方式是使用JUnit5 API完成新的测试,并且使用专用的JUnitPlatform运行器在JUnit4下运行。但是,刚才我们不是才说JUnit4的症结是运行器么?当然,这个JUnitPlatform是一个受限的运行器,他只能支持新版本的一部分功能。但是,这仍然是一个开始使用新版本API的不错的开始。最快的学习方法就是在真实项目中使用,对吧。

第二种方式,是将JUnit5作为主要的测试运行器。除了能获取框架带来的诸多优势,你也可以在新的平台中运行老版本的测试,当然有一些限制。由于设计概念上的区别,JUnit4中只有部分的一些特性能够在JUnit5中运行。在你迈进JUnit5之前,先了解一下这些限制:http://junit.org/junit5/docs/current/user-guide/#migrating-from-junit4-rulesupport

做贡献的机会
因为新版本还在持续开发过程中,这个时候提交一些有用的想法,是非常好的机会。框架的使用者,你期望在项目中能用到哪些新的功能,每一个有用的想法都可以通过issue提交到JUnit5项目中。

但是,当你提交一个新的issue的时候,请确保这个想法在框架中确实没有实现。尽量不要为团队开发者去处理已经存在的issue或者没有太多价值的issue。但是,如果你有一个好的建议,不要犹豫,请提交一个issue。对开源的贡献一定不是仅仅只局限于代码提交,贡献idea同样重要。JUnit5的issues列表:https://github.com/junit-team/junit5/issues

JVM测试
JUnit5的目标,不仅仅只是瞄准测试框架。JUnit5的重大改进不仅仅只是打破了常规的API,或者引入了新的扩展模型。一个非常重要的目标,是打造一个基于JVM测试框架的基础平台。这意味着什么?我们来看一个图:

你可以看到,就像洋葱一样,JUnit5的架构也是分层的。最核心的就是基础平台。IDE和构建工具都是作为客户端和这个核心平台交互,以达到在项目中运行测试的目的。TestEngine的实现在平台中用于发现和运行测试,并且输出测试报告,并通过核心平台返回给客户端。

核心关注点是扩展能力,但并不仅仅只是存在于测试类级别。在整个测试平台级别,都提供了足够的扩展能力。任何一个框架都可以在JUnit平台上运行他自己的测试,只需要提供框架本身对TestEngine接口的实现即可。只需要一点点工作,通过这一个扩展点,框架就能得到所有IDE和构建工具在测试上的支持。这对于新框架来说绝对是好事,在测试和构建这块的门槛更低。

这些对于一个开发者来说意味着什么呢?这意味着一个测试框架和JVM开发市场上所有主流的工具集成的时候,你能更容易的说服你的经理,开发leader,或者不管是谁阻碍你引入这个测试框架的人。 JUnit Vintage就是一个TestEngine实现,用于执行JUnit4的测试。
 

从JUnit 4到JUnit 5:大型项目测试框架迁移的工程化实践与难点解析 在软件工程领域,单元测试是保障代码质量、支撑持续集成的核心实践。JUnit作为Java生态中最主流的测试框架,其版本演进不仅带来了新的API,更引入了全新的扩展模型和并发执行等现代化特性。理解JUnit 5的Extension模型如何替代JUnit 4的Rule机制,掌握断言API的升级路径,是技术升级的关键。这些改进显著提升了测试代码的可读性、可维护性和执行效率,尤其适用于微服务架构和DevOps流水线中对测试反馈速度要求高的场景。本文聚焦于超大规模测试代码库的现代化迁移,针对**静态代码分析**工具在自 阅读详情

相关推荐

JUnit 5单元测试实战:从环境搭建到Mockito集成

单元测试是软件工程中保障代码质量的核心实践,它通过对程序最小可测试单元进行自动化验证,确保代码修改不会引入意外错误。其原理在于通过模拟各种输入和状态,验证代码行为是否符合预期,从而构建起一套可重复执行的验证体系。在Java生态中,JUnit作为事实标准的单元测试框架,其技术价值在于提供了丰富的断言机制、灵活的生命周期管理以及强大的扩展模型,能够显著提升开发效率和代码可维护性。JUnit 5作为当前主流版本,引入了参数化测试、嵌套测试等高级特性,并与构建工具和IDE深度集成。在实际应用场景中,单元测试常与Mo

weixin_34234829的博客 333

从JUnit4迁移到JUnit5:重要的区别和好处

目录 原文地址: Migrating from JUnit 4 to JUnit 5: Important Differences and Benefits

m0_60725291的博客 2187

从Postman到SoapUI Pro:构建企业级API自动化测试框架实战指南

API测试是软件质量保障的关键环节,其核心在于验证接口的功能、性能和可靠性。从基础的接口调试到企业级的自动化测试,需要更专业的工具和方法论支撑。数据驱动测试和持续集成是提升测试效率和可靠性的核心技术,前者通过外部数据源批量验证业务逻辑,后者则将测试无缝融入开发流程,实现快速反馈。SoapUI Pro作为一款专业的API测试工具,原生支持数据驱动测试、复杂断言、负载测试,并能通过命令行与Jenkins等CI/CD工具深度集成,为构建从调试到自动化的完整测试框架提供了强大支持。本文以SoapUI Pro 5.7

weixin_28828243的博客 286

spring-boot-starter-test下的junit报错:Cannot resolve junit:junit:5.7.1

将maven setting配置文件阿里云的下载地址注释掉了但发现还是报错。后面手动将包导入后问题才解决。

fajdf的博客 6万+

Superpowers:面向TDD的工程化测试生成工具解析

测试驱动开发(TDD)是一种强调先写测试再实现功能的软件工程实践,其核心价值在于通过可执行的规格约束设计质量、提升可维护性。然而现实中,TDD落地常受阻于测试编写成本高、上下文理解弱、框架适配难等问题。Superpowers并非通用AI编程助手,而是聚焦验证环节的轻量级工程化工具,依托AST解析、类型推导与项目上下文学习,在本地完成确定性测试生成。它支持Java/Spring Boot与TypeScript/React等主流技术栈,具备离线运行、无数据外泄、可审计等企业级合规特性。本文深入剖析其三层能力演进

HJ921004的博客 610

junit5.7 pdf

junit 单元测试,集成测试文档

Junit4升级Junit5汇总

Junit4升级Junit5问题汇总

qq_42007339的博客 2202

junit-jupiter-api-5.7.1.jar

junit-jupiter-api-5.7.1.jar

Junit5入门小总结(超详细)持续更新···

Junit5 java单元测试 自定义测试运行器 测试的类很多,组合在一起成为一个测试套件 `@ExtendWith` 正常情况下仅SpringBootTest注解即可,如果对扩展性有更多需求,可以添加ExtendWith注解 @ExtendWith(DatabaseExtension.class) @ExtendWith(WebServerExtension.class) class MySecondTests{ //... } 常用注解(Spring

soulwirter的博客 742

junit-jupiter-5.7.0.jar

junit-jupiter-5.7.0.jar

传感器融合的智能演进:ST-MC-Workbench中霍尔与编码器的协同控制策略

本文探讨了ST-MC-Workbench中霍尔传感器与编码器的协同控制策略,通过传感器融合技术提升电机控制精度。文章详细介绍了分层处理架构、霍尔安装角度优化及编码器Z脉冲容错机制,展示了在新能源汽车和工业应用中的实际效果,为高精度位置检测提供了解决方案。

weixin_29159441的博客 484

junit4 升级 junit 5 兼容问题

junit-vintage-engine 升级为 5.6.3,junit-jupiter 版本号保持一致,也升级5.6.3。

weixin_39466433的博客 977

告别实车测试:手把手教你用Vector VT平台搭建OBC/DCDC的HIL测试台架

本文详细介绍了如何利用Vector VT平台搭建新能源汽车OBC/DCDC的HIL测试台架,涵盖硬件选型、模型部署到自动化测试的全流程。通过HIL仿真测试技术,工程师可以高效验证动力域关键部件,大幅缩短开发周期并降低成本,特别适合新能源汽车三电系统的开发验证。

weixin_42659194的博客 340

Junit4的在普通java项目里的运用

这里是以junit4为演示,引入和注解,不用再自己继承测试类了,非常方便 一、Junit常用的注解 注解 解释 @Before 和setUp()方法功能一样,在每个测试方法之前执行 @After 和tearDown方法功能一样,在每个测试方法之后执行 @BeforeClass 在所有方法执行之前执行(注意是在一个测试类的范围) @AfterClass 在所有的方法执...

胖墩的IT博客 800

【Simscape】用Simscape实现三维物理仿真(三)——创建一个滑块单摆系统

1 首先创建一个Simscape Multibody 模型 (方法见 【Simscape】用Simscape实现三维物理仿真(一)——创建一个自由落体小球) 2 创建四个Solid模块 (1)摆杆 Shape : Brick Dimensions : [0.1 0.05 1] m (2)摆杆轴 Shape : Cylinder Radius : 0.02 m Le...

ReadAir的专栏 9037

模仿学习与强化学习结合(IL+RL)有没有代表性论文?未来发展趋势如何?

IL与RL的结合正成为AI研究热点,尤其在机器人控制、复杂博弈等需要边学边练的场景。经典方法如Dagger(2010)和GAIL(2016)开创了先用模仿学习预热、再用强化学习微调的模式。近期工作如IN-RIL(2024)提出交替训练策略,显著提升样本效率。开源项目RoboSchool和StableBaselines3为相关研究提供支持。未来趋势包括:1)混合式智能体结合人类经验与自主探索;2)突破小样本学习、自然语言交互等方向;3)提升安全性、样本效率和可解释性。

CyberSoma的博客 2249

Java单元测试实战:JUnit 5与Mockito高效组合应用指南

单元测试是软件工程中保障代码质量的核心实践,它通过隔离测试单元来验证代码逻辑的正确性。其原理在于模拟依赖、控制输入并断言预期输出,从而构建快速反馈的安全网。这一实践的技术价值在于提升代码可维护性、促进重构信心并及早发现缺陷。在Java开发领域,JUnit 5作为现代测试框架标准,与Mockito这一强大的模拟框架形成黄金组合,广泛应用于服务层逻辑、数据访问层及Web控制器的测试场景。本文聚焦于这对组合的实战应用,深入讲解JUnit 5的参数化测试、动态测试等新特性,以及Mockito在依赖模拟、行为验证方面

577

FreeSurfer预处理命令

比如将/source/kernel.tgz解压到 /source/linux-2.6.29 目录 tar zxvf /source/kernel.tgz -C /source/ linux-2.6.29 tar zxvf /home/tj/application/freesurfer/subjects/mindboggle/OASIS-TRT-20-1.tar.gz -C /home/tj/application/freesurfer/subjects (1)lh.thickness mri_surf2su

Dream19961996的博客 1508

JUnit Fixture详解:告别重复代码,提升单元测试质量

在软件工程实践中,单元测试是保障代码质量的核心环节。其核心原理在于通过自动化验证代码单元的行为,确保功能的正确性与稳定性。良好的测试结构能显著提升代码的可维护性和开发效率,其技术价值体现在快速反馈、回归预防和设计改善等方面。在Java开发领域,JUnit是应用最广泛的单元测试框架之一。针对测试中常见的代码重复、资源泄露和测试隔离性破坏等痛点,JUnit Fixture机制提供了一套优雅的解决方案。它通过@BeforeEach、@AfterEach、@BeforeAll、@AfterAll等注解,实现了测试准

weixin_33812433的博客 290

银河麒麟编译libjpeg库并配置qt环境

银河麒麟下编译libjpeg库并配置qt环境验证

小米的修行之路 1015

高通Camx功能feature分析之二:remosaic流程

本文介绍了Remosaic技术及其在图像处理中的应用。Remosaic是将4cell1像素排布还原为普通Bayer结构的过程,分为硬件和软件两种实现方式。文章详细解析了Remosaic流程,包括配流情况、Feature选择、初始化过程,以及触发拍照的完整流程。重点分析了从普通预览切换到全尺寸拍照的关键步骤:激活全尺寸RDI会话、生成请求、等待就绪、唤醒离线线程和重启预览。通过代码层面的分析,揭示了Remosaic技术如何实现高分辨率图像还原,同时说明了该过程中可能出现的预览定屏现象及其原因。

1880

JUnit 4.1——單元測試框架

參考:升级到JUnit5的7个理由https://blog.youkuaiyun.com/wolfcode_cn/article/details/84065888、w3cschoolhttps://www.w3cschool.cn/junit/x6o71hv6.html unittest单元测试框架总结、Java单元测试之JUnit篇https://blog.youkuaiyun.com/...

weixin_30745553的博客 131

NVIDIA - 人形机器人扼要

人形机器人是仿照人类外形设计的通用双足机器人,旨在与人类并肩工作,提高生产效率。它们能够学习和执行各种任务,如抓取物体、移动集装箱、装卸箱子等。

机器人控制与仿真应用 1291

2026年软件测试工程师面试必备7大技术模块解析

软件测试作为保障软件质量的关键环节,其技术体系正经历快速演进。测试金字塔模型从传统的三层结构发展为包含AI测试和混沌工程的多层架构,反映了测试自动化和智能化的趋势。在工程实践中,测试框架选型需综合评估学习成本、执行效率及AI集成能力,如Playwright凭借优秀的跨平台支持成为新宠。随着持续交付的普及,CI/CD管道中的测试自动化成为必备技能,包括环境变量管理、Docker化执行等实践。性能测试方面,全链路压测和智能瓶颈定位技术帮助应对高并发挑战,而安全测试则需关注OWASP Top 10新威胁和隐私合规

473

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Opus 5 引领 AI 编程范式变革:从代码生成到解决方案生成的实战指南

代码生成是人工智能在软件开发领域的重要应用,其核心原理是基于大规模代码语料训练的大语言模型,通过理解自然语言指令或上下文,预测并输出符合语法的代码片段。这项技术的价值在于显著提升开发效率,自动化处理重复性编码任务。随着模型能力的演进,其应用场景正从简单的代码补全和片段生成,向更复杂的“解决方案生成”范式转移。这意味着 AI 开始能够理解高层次业务需求,并输出涵盖架构设计、多文件代码实现、工程化配置及部署说明的完整方案。这种“端到端问题解决”能力的跃升,对开发者的工作流、代码评审和质量保障体系提出了新挑战,也

weixin_30394981的博客 330

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: JUnit 5 最棒的 5 个新特性
下一篇: 单元测试之JUnit5介绍
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值