写点什么

JUnit 6.0.0 发布,带来 Java 17 基线、Cancellation API 和 Kotlin suspend 支持

作者:A N M Bazlur Rahman

  • 2025-10-29
    北京
  • 本文字数:2348 字

    阅读完需:约 8 分钟

大小:948.10K时长:05:23
JUnit 6.0.0发布,带来Java 17基线、Cancellation API和Kotlin suspend支持

JUnit 团队发布了 JUnit 6.0.0(2025 年 9 月 30 日公开可用),统一了 Platform、Jupiter 和 Vintage 的版本号,并将最低 Java 版本提升至 17(对于 Kotlin 测试代码则是 Kotlin 2.2)。此更新增加了对 Kotlin suspend 测试的原生支持,新的 CancellationToken API 在 ConsoleLauncher 中支持快速失败执行,内置 Java Flight Recorder(JFR)监听器,跨模块采用 JSpecify 空值注解,以及切换到 FastCSV,用于 CSV 驱动的参数化测试。Vintage 模块仍是用于 JUnit 4 的桥梁,但现已被弃用。


对于 Kotlin 用户来说,最明显的改进是直接支持 suspend。以前,协程测试经常将主体包装在 runBlocking 中;使用 JUnit 6 时,开发者可以在测试和生命周期方法上声明 suspend,并直接调用 suspending API。这消除了样板代码,使协程测试看起来像它们所练习的生产代码。


考虑以下代码片段:


// Before JUnit 6@Testfun foo() = runBlocking {delay(1000)assertEquals(1, 1)}


// With JUnit 6@Testsuspend fun foo() {delay(1000) // suspend call works directlyassertEquals(1, 1)}


在执行语义方面,JUnit 6 为嵌套类定义了一个确定性的、有意不明显的顺序。它还引入了 MethodOrderer.Default 和 ClassOrderer.Default,并将 @TestMethodOrder 继承到 @Nested 类中。开发者现在也可以使用 @TestClassOrder 和 @Order 为嵌套类施加顺序。


以下示例在 SecondaryTests 之前运行 PrimaryTests:


import org.junit.jupiter.api.*;


@TestClassOrder(ClassOrderer.OrderAnnotation.class)class OrderedNestedTestClassesDemo {


@Nested @Order(1)class PrimaryTests {    @Test void test1() {}}
@Nested @Order(2)class SecondaryTests { @Test void test2() {}}
复制代码


}


所有 JUnit 模块现在都使用 JSpecify 空值注解来明确指示哪些方法参数、返回类型和字段可以为空。这为 IDE 提供更好的支持,提高了编译时安全性,并为从正确的可空/非可空类型区分中受益的 Kotlin 用户提供了更精确的文档。


JUnit 6 从不再维护的 univocity-parsers 库迁移到 FastCSV,用于 @CsvSource 和 @CsvFileSource 注解。FastCSV 速度显著更快,符合 RFC 4180 标准,没有依赖项,并为格式错误的 CSV 数据提供更好的错误报告。这一变化提高了 CSV 解析行为的一致性和整体测试执行性能。


取消和提前退出行为也得到了显著升级。平台现在公开了 CancellationToken,启动器将其传递给引擎。开发者可以连接自己的监听器,在第一次失败时取消运行,ConsoleLauncher 增加了一个--fail-fast 标志,可以自动执行此操作。以下代码片段显示了使用新的 LauncherExecutionRequest API 的监听器驱动方法。像 Jupiter 和 Suite 这样的引擎尊重该令牌,因此执行可以干净地中止。


import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.discoveryRequest;import static org.junit.platform.launcher.core.LauncherExecutionRequestBuilder.executionRequest;


import java.io.PrintWriter;


import org.junit.platform.engine.CancellationToken;import org.junit.platform.engine.TestExecutionResult;import org.junit.platform.launcher.*;import org.junit.platform.launcher.core.LauncherFactory;import org.junit.platform.launcher.listeners.SummaryGeneratingListener;


public class FailFastLauncher {


static void main() {    CancellationToken token = CancellationToken.create();
TestExecutionListener failFast = new TestExecutionListener() { @Override public void executionFinished(TestIdentifier id, TestExecutionResult result) { if (result.getStatus() == TestExecutionResult.Status.FAILED) { token.cancel(); } } };
SummaryGeneratingListener summary = new SummaryGeneratingListener();
LauncherDiscoveryRequest discover = discoveryRequest() .selectors(selectClass(FastFailDemoTest.class)) .build();
LauncherExecutionRequest exec = executionRequest(discover) .cancellationToken(token) .listeners(failFast, summary) .build();
try (LauncherSession session = LauncherFactory.openSession()) { session.getLauncher().execute(exec); }
summary.getSummary().printTo(new PrintWriter(System.out, true));}
复制代码


}


JFR 支持现在内置于启动器下的 org.junit.platform.launcher.jfr 中,取代了旧的 junit-platform-jfr 构件。开发者可以在启动测试时开始 JFR 录制,然后在 JDK Mission Control 或*.jfr 工具中检查发现和执行事件,无需添加任何额外依赖项。详细信息记录在用户指南中的“Flight Recorder Support”下。


6.0.0 版本移除了长期弃用的 junit-platform-runner(JUnit 4 运行器)和各种遗留的反射和运行器 API。团队建议在 IDE/构建工具中使用原生的 Plaform 集成或直接采用 Jupiter;Vintage 现在只作为临时的桥接,已被正式弃用。对于要升级到 5.x 版本的团队,可以参考该迁移 wiki。


对于大多数已在使用 Java 17 和 JUnit 5.14 的团队来说,采用该新版本应该是一个常规的依赖项升级,随后的工作包括快速的试运行,现代化任何构建插件(例如,Surefire/Failsafe ≥ 3.0),并验证由 CSV 驱动的测试。Kotlin 用户可以通过直接的 suspend 方法简化协程测试,JFR 集成变得更容易采用,以便于性能调查。仍在使用 JUnit 4 的团队应该计划迁移工作,因为 Vintage 的弃用标志着那条兼容性路径的结束。


原文链接:JUnit 6.0.0 Ships with Java 17 Baseline, Cancellation API, and Kotlin suspend Support

2025-10-29 09:292871

评论

发布
暂无评论

算法:八皇后问题

看山

面试 算法 6月日更

react源码解析17.context

全栈潇晨

React

都有哪些较好用的项目管理软件?

万事ONES

项目管理 研发管理 ONES 研发工具

在线时间戳格式化转换工具【推荐】

入门小站

工具

校友会小程序开发笔记九: 校友群助手功能模块设计与实现

CC同学

校友会小程序 同学录小程序

spring boot 自动装配原理详解

公众号:程序猿成神之路

Spring Boot

HarmonyOS学习路之开发篇——Intent

爱吃土豆丝的打工人

HarmonyOS Ability intent 页面跳转

JAVA面向对象(九)--继承

加百利

6月日更

打造一个通用、可配置、多句柄的数据上报 SDK

魅影

sqlite 数据库 APM 多线程 数据上报

浪潮云说丨构建实时监控能力,提升应用质效

云计算

十亿级流量下,我与Redis时延小突刺的战斗史

vivo互联网技术

redis Jedis 调用链 流量防控

公安局指挥中心一体化管理系统,情指勤合成作战

校友会小程序开发笔记十一: 后台管理系统功能设计与实现

CC同学

校友录小程序 同学录小程序

从Linux零基础小白到Linux云计算架构师的成长之路!

学神来啦

Linux 运维 运维自动化

PornNet:色情视频内容识别网络

百度Geek说

云计算 大数据 后端 图像识别

【21-14】singularity介绍

耳东@Erdong

6月日更 singularity

Linux之rm命令

入门小站

Linux

降低网络AI应用开发门槛,AIOps两大部署模式来助力

华为云开发者联盟

运维 RPA 自动化 AIOPS 华为云AIOps

Python——有序字典 (OrderedDict)

在即

6月日更

深入了解Spring之事件机制

邱学喆

观察者模式 spring的事件机制 EventListener注解

校友会小程序开发笔记十: 校友资讯功能模块设计与实现

CC同学

校友录小程序 同学录小程序

我的小程序开源啦~

悟空聊架构

小程序 刷题 SpringCloud passjava 6月日更

EasyRecovery---视频文件恢复技巧

淋雨

数据恢复 EasyRecovery 文件恢复 免费恢复软件 硬盘数据恢复

ONES x 知名车企 | 软硬件研发项目管理实践

万事ONES

项目管理 研发管理 ONES

技术部门Leader:如何平衡技术能力与项目管理能力?

万事ONES

项目管理 研发管理 技术管理 ONES

喜讯 | 拍乐云荣膺「全球云计算大会“云鼎奖”」,先进技术受业界肯定

拍乐云Pano

2021年5月券商App行情刷新及交易体验评测报告

博睿数据

博睿数据 券商App 性能评测

【Vue2.x 源码学习】第二十一篇 - 依赖收集的过程分析

Brave

源码 vue2 6月日更

App 上架包预检

魅影

ios Node 代码扫描 脚本 应用审核

技术生态两手抓,打造面向未来的企业级领先数据库

华为云开发者联盟

数据库 开源 云原生 华为云 GaussDB

我是一个请求,我该何去何从

华为云开发者联盟

CSE 请求 条件 Verticle Route

JUnit 6.0.0发布,带来Java 17基线、Cancellation API和Kotlin suspend支持_后端_InfoQ精选文章