
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 {
}
所有 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 {
}
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








评论