本文档包含自 5.11 GA 以来所有 JUnit 5 版本的变更日志

请参考用户指南,获取为编写测试的程序员、扩展作者、引擎作者以及构建工具和 IDE 供应商提供的全面参考文档。

5.12.0

发布日期: 2025 年 2 月 21 日

范围

  • 测试和容器的输出文件附件

  • Open Test Reporting XML 输出的改进

  • 资源锁定义改进

  • 测试超时时的线程转储

  • 参数化测试验证改进

  • 自动注册扩展的过滤支持

  • 用于断言的 Kotlin 契约

  • 可配置的 Jupiter 扩展上下文作用域

  • ConsoleLauncher 的增强功能

  • 更好地支持 GraalVM 本机镜像的使用

  • 改进了对基于文件的测试引擎的发现支持

  • 可自定义的类路径扫描

  • JUnit Vintage 引擎中的并行执行支持

  • 大量的错误修复和其他增强功能

有关此版本所有已关闭的 issue 和 pull request 的完整列表,请查阅 GitHub 上 JUnit 仓库中的 5.12.0-M15.12.0-RC15.12.0-RC25.12.0 里程碑页面。

总体改进

新特性和改进

  • 所有受影响的 JAR 文件现在都包含 native-image.properties 文件,其中包含 --initialize-at-build-time 选项,以避免在 GraalVM 项目更新到较新版本的 JUnit 时出现中断。

JUnit 平台

弃用和重大变更

  • 来自 junit-platform-commonsSearchOptionAnnotationSupport.findAnnotation(Class, Class, SearchOption) 已被弃用。

新特性和改进

  • ConsoleLauncher 现在接受所有 --select 选项的多个值。

  • ConsoleLauncher 现在支持 --select-unique-id 选项,以通过唯一 ID 选择容器和测试。

  • ConsoleLauncher 支持新的 --exclude-methodname--include-methodname 选项,以基于不带参数的完全限定方法名包含或排除方法。例如,--exclude-methodname=^org\\.example\\..+#methodname 将排除包 org.example 下所有名为 methodName 的方法。

  • ConsoleLauncher--select-file--select-resource 选项现在支持行号和列号。

  • 新的 ReflectionSupport.makeAccessible(Field) 公共实用方法,供第三方使用,以代替直接调用内部 ReflectionUtils.makeAccessible(Field) 方法。

  • ReflectionSupport.tryToLoadClass(…​) 实用方法现在支持查找 "void" 伪类型,这间接支持 JUnit Jupiter 中参数化测试中 "void"StringClass 转换。

  • EngineDiscoveryRequestResolver.Builder 中的新 addResourceContainerSelectorResolver() 方法,支持发现基于类路径资源的测试,类似于现有的 addClassContainerSelectorResolver() 方法。

  • EngineDiscoveryRequestTestPlan 中的新 getOutputDirectoryProvider() 方法,允许测试引擎通过调用 EngineExecutionListener.fileEntryPublished(…​) 将文件发布/附加到容器和测试。注册的 TestExecutionListeners 然后可以通过覆盖 fileEntryPublished(…​) 方法来访问这些文件。

  • 以下是对 Open Test Reporting XML 输出所做的改进

    • 如果适用,XML 报告现在包含有关 Git 仓库、当前分支、提交哈希和当前工作树状态的信息。

    • 当添加到类路径/模块路径时,open-test-reporting 现在会将一个包含有关每个测试/容器的 JUnit 特定元数据的部分写入 HTML 报告

    • 有关已发布文件的信息现在作为附件包含在内。

    • 如果启用了输出捕获,则写入 System.outSystem.err 的捕获输出现在包含在 XML 报告中。

  • 从非测试线程写入到 System.outSystem.err 的输出现在归因于最近启动或已写入输出的测试或容器。

  • 新的公共接口 ClasspathScanner,允许第三方提供用于扫描类路径以查找类和资源的自定义实现。

  • 新的 AnnotationSupport.findAnnotation(Class, Class, List) 方法,支持在内部类及其运行时封闭实例类型上搜索注解。

  • 新的 TestDescriptor.orderChildren(UnaryOperator<List<TestDescriptor>> orderer) 方法,用于就地排序子节点

JUnit Jupiter

错误修复

  • DisplayNameGenerator 实现提供 @Nested 测试类和包含的测试方法的运行时封闭类型。在此更改之前,此类生成器只能访问声明 @Nested 的封闭类,但它们无法访问封闭实例的具体运行时类型。

  • 现在在 @Nested 测试类的运行时封闭类型上发现 @DisplayNameGeneration 注解,而不是 @Nested声明的编译时封闭类。

  • 修复 Windows 上在 @TempDir 清理期间对“连接点”的处理:删除目录时将不再跟随连接点,并且将删除损坏的连接点。

弃用和重大变更

  • 当将 TestInfo 注入到测试类构造函数中时,TestInfo 现在包含正在为其创建测试类实例的测试方法的数据,除非测试实例生命周期设置为 PER_CLASS(在这种情况下,它将继续包含测试类的数据)。如果您需要测试类的 TestInfo,您可以实现 @BeforeAll 生命周期方法并将 TestInfo 注入到该方法中。

  • 当将 TestReporter 注入到测试类构造函数中时,发布的报告条目现在与测试方法而不是测试类关联,除非测试实例生命周期设置为 PER_CLASS(在这种情况下,发布的报告条目将继续与测试类关联)。如果您想为测试类发布报告条目,您可以实现 @BeforeAll 生命周期方法并将 TestReporter 注入到该方法中。

新特性和改进

  • Assertions 中 Kotlin 特定断言方法的 Kotlin 契约。

  • 现在在测试类构造函数上支持 @TempDir

  • 现在可以通过新的 @ResourceLock#providers 属性以编程方式在运行时确定共享资源锁,该属性接受 ResourceLocksProvider 的实现。

  • 现在可以通过新的 @ResourceLock(target = CHILDREN) 属性配置直接子节点的共享资源锁。当测试类声明 READ 锁时,但这可能会提高并行化,但只有少数方法持有 READ_WRITE 锁。

  • @EnumSource 具有新的 fromto 属性,支持在指定范围内选择枚举常量。

  • @ParameterizedTest 方法中,如果 @JavaTimeConversionPattern 中的新 nullable 属性设置为 true,则现在可以为 Java Date/Time 类型(例如 LocalDate)提供 null 值。

  • 新的 @ParameterizedTest(allowZeroInvocations = true) 属性允许指定在某些情况下缺少调用是预期的,并且不应导致测试失败。

  • 参数化测试现在支持参数计数验证。如果设置了 junit.jupiter.params.argumentCountValidation=strict 配置参数或 @ParameterizedTest(argumentCountValidation = STRICT) 属性,则声明的参数数量与参数源提供的参数数量之间的任何不匹配都将导致错误。默认情况下,只有在提供的参数少于声明的参数时才会报错。

  • ArgumentsProvider(通过 @ArgumentsSource 声明)、ArgumentConverter(通过 @ConvertWith 声明)和 ArgumentsAggregator(通过 @AggregateWith 声明)实现现在可以使用来自已注册 ParameterResolver 扩展的构造函数注入。

  • TestTemplateInvocationContextProvider 扩展现在可以通过覆盖新的 mayReturnZeroTestTemplateInvocationContexts() 方法来发出信号,表明它们可能返回零个调用上下文。

  • 实现 TestInstancePreConstructCallbackTestInstanceFactoryTestInstancePostProcessorParameterResolverInvocationInterceptor 的扩展可以覆盖 getTestInstantiationExtensionContextScope() 方法,以在测试类实例化期间调用的 Extension 方法中启用接收测试作用域的 ExtensionContext。此行为将在未来版本的 JUnit 中成为默认行为。

  • 新的 PreInterruptCallback 接口为希望在 @Timeout 扩展调用 Thread#interrupt() 之前被调用的 Extensions 定义了 API。

  • 当通过 junit.jupiter.execution.timeout.threaddump.enabled 配置参数启用时,将注册 PreInterruptCallback 的实现,该实现在由于超时而中断测试线程之前将线程转储写入 System.out

  • TestReporter 现在允许为测试方法或测试类发布文件,这些文件可用于将其包含在测试报告中,例如 Open Test Reporting 格式。

  • 现在可以使用可以指定为配置参数的包含和排除模式过滤自动注册的扩展。

  • 基于 JRE 的条件(例如 @EnabledOnJre@DisabledForJreRange)现在支持任意 Java 版本。有关详细信息,请参阅用户指南

  • 当删除目标位置在临时目录之外的符号链接时,@TempDir 扩展现在会在清理期间发出警告,以表明目标文件或目录被删除,仅删除了指向它的链接。

JUnit Vintage

新特性和改进

  • 增加了对并行执行测试类和/或方法的支持。有关更多信息,请参阅用户指南

5.11.4

发布日期: 2024 年 12 月 16 日

范围: 自 5.11.3 以来的错误修复和增强功能

有关此版本所有已关闭的 issue 和 pull request 的完整列表,请查阅 GitHub 上 JUnit 仓库中的 5.11.4 里程碑页面。

JUnit 平台

错误修复

  • 在 Console Launcher 生成的旧版 XML 报告中,转义 XML 属性值(例如异常消息)中的空格字符(例如换行符)。此更改确保下游工具可以处理生成的 XML 文件,同时保留空格字符。

  • ConsoleLauncher 中启用输出自动刷新,以修复缓冲问题,尤其是在使用 --details=testfeed 选项时。

JUnit Jupiter

新特性和改进

  • JAVA_25 已添加到 JRE 枚举中,用于基于 JRE 的执行条件。

JUnit Vintage

无变更。

5.11.3

发布日期: 2024 年 10 月 21 日

范围: 自 5.11.2 以来的错误修复和增强功能

有关此版本所有已关闭的 issue 和 pull request 的完整列表,请查阅 GitHub 上 JUnit 仓库中的 5.11.3 里程碑页面。

JUnit 平台

错误修复

  • 修复了 5.11.0 中引入的方法搜索算法的回归,当类位于默认包中并使用 Java 8 运行时时会出现此回归。

JUnit Jupiter

错误修复

  • 扩展可以再次通过测试类中字段上同一组合注解上的多个 @ExtendWith 元注解进行注册。

  • 当直接在字段和参数上使用时,@ExtendWith 注解现在也可以重复使用。

  • 参数化测试的所有 @…​Source 注解现在也可以在用作元注解时重复使用。

JUnit Vintage

无变更。

5.11.2

发布日期: 2024 年 10 月 4 日

范围: 自 5.11.1 以来的错误修复和增强功能

有关此版本所有已关闭的 issue 和 pull request 的完整列表,请查阅 GitHub 上 JUnit 仓库中的 5.11.2 里程碑页面。

JUnit 平台

错误修复

  • 修复了 5.11.1 中引入的关于全局读写锁的并行执行中的回归。当在测试树中顶级节点的后代(例如 Cucumber 场景)上声明此类锁时,测试执行失败。

JUnit Jupiter

无变更。

JUnit Vintage

无变更。

5.11.1

发布日期: 2024 年 9 月 25 日

范围: 自 5.11.0 以来的错误修复和增强功能

有关此版本所有已关闭的 issue 和 pull request 的完整列表,请查阅 GitHub 上 JUnit 仓库中的 5.11.1 里程碑页面。

JUnit 平台

错误修复

  • 修复了在 NO_COLOR 环境变量可用时禁用控制台上的 ANSI 颜色的支持。

  • NamespacedHierarchicalStore 在关闭后,如果通过 get(…​)getOrComputeIfAbsent(…​) 方法之一查询存储,则不再抛出异常;但是,如果 getOrComputeIfAbsent(…​) 调用导致计算新值,则仍会抛出异常。

  • 修复了 HierarchicalTestExecutorServiceExclusiveResource 的潜在锁定问题,这可能导致某些场景下的死锁。

新特性和改进

  • 当启用并行执行并使用全局读写锁时,改进了并行性并减少了 HierarchicalTestEngine 实现使用的阻塞线程数。

JUnit Jupiter

错误修复

  • TestWatcher 回调方法可以再次访问 ExtensionContext.Store 中的数据。

新特性和改进

  • 当启用并行执行时,在存在 @Isolated 测试的情况下,改进了并行性并减少了阻塞线程数

JUnit Vintage

无变更。

5.11.0

发布日期: 2024 年 8 月 14 日

范围

  • 用于 @ParameterizedTest 方法的 @FieldSource 注解

  • 用于参数化测试的可重复 @..Source 注解

  • 用于编写动态和参数化测试的增强功能

  • 用于自动关闭测试中字段资源的 @AutoClose 注解

  • 用于从字符串转换为受支持目标类型的 ConversionSupport 实用程序

  • 用于指定发现选择器的可扩展语法

  • @BeforeSuite@AfterSuite 注解

  • 引擎的类路径资源扫描支持

  • 关于字段和方法搜索算法的大量错误修复和增强功能

有关完整详细信息,请在线查阅 5.11.0 发行说明