写点什么

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:294

评论

发布
暂无评论

怎么查询游戏服务器IP?哪些工具可以协助?

一只扑棱蛾子

服务器

产品经理必备的API技术知识

幂简集成

产品经理 API

IDC 权威认可!Aloudata 入选金融领域中数据管理分析服务最佳实践案例

Aloudata

数据分析 自动化 IDC 全链路数据血缘 金融数据

海外云手机——电商最有效的引流工具

Ogcloud

云手机 海外云手机 云手机海外版 电商云手机 跨境云手机

NFTScan | 05.06~05.12 NFT 市场热点汇总

NFT Research

NFT NFT\ NFTScan

个人名片升级攻略:ChatGPT助您塑造独特简历风格

测试人

软件测试 简历 ChatGPT

电商后台的秘密:通过API接口提取商品信息

Noah

一键自动化博客发布工具,用过的人都说好(csdn篇)

程序那些事

工具 程序那些事 自动发布

在数字化时代保持企业财务管理的持续技术创新

智达方通

外贸网站优化为什么要布置内部链接?如何优化内链?

九凌网络

深入解析Apache Flink核心概念:事件流、状态、事件时间和快照

木南曌

实时计算

进一步解读英伟达 Blackwell 架构、NVlink及GB200 超级芯片

GPU算力

深度学习 英伟达 Blackwell GB200

大厂技术同学的落地困境

老张

团队管理 职业规划 职场发展 大厂求职

特权账号管理的那些坑

芯盾时代

iam 统一身份认证 特权账号管理

怪兽AI数字人直播软件

Mr_song

AI 短视频 直播 数字人

人类将会永生?谷歌 DeepMind重磅发布Alphafold 3 ——天花板级别的AI系统

GPU算力

深度学习 DeepMind 生物信息学 AlphaFold 蛋白质预测

Django性能之道:缓存应用与优化实战

不在线第一只蜗牛

sqlite django 缓存

建木Hub流水线正式版上线啦!!限时送200分钟体验时长

都广科技

DevOps

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