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

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

5.10.2

发布日期:2024 年 2 月 4 日

范围:自 5.10.1 以来的一些错误修复和更改。

有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的5.10.2里程碑页面。

JUnit 平台

错误修复

  • junit.platform.launcher.interceptors.enabled设置为true时,junit-platform-launcher现在可以作为 Java 模块使用。

    • 有关详细信息,请参阅问题#3561

弃用和重大更改

  • 字段谓词不再在搜索类型层次结构时被急切地应用。

    • 这恢复了在 5.10.1 中进行的更改,这些更改影响了ReflectionSupport中的findFields(…​)streamFields(…​)以及AnnotationSupport中的findAnnotatedFields(…​)findAnnotatedFieldValues(…​)

    • 有关详细信息,请参阅问题#3638

  • 方法谓词不再在搜索类型层次结构时被急切地应用。

    • 这恢复了在 5.10.1 中进行的更改,这些更改影响了ReflectionSupport中的findMethods(…​)streamMethods(…​)以及AnnotationSupport中的findAnnotatedMethods(…​)

    • 有关详细信息,请参阅问题#3600

JUnit Jupiter

错误修复

  • JUnit Jupiter 再次正确检测到何时在子类中覆盖了@Test方法。

    • 有关详细信息,请参阅问题#3600

弃用和重大更改

  • 当非静态字段位于不同的包中并且与静态字段具有相同的名称时,使用@TempDir注释的包私有静态字段再次被使用@TempDir注释的非静态字段遮蔽

    • 这恢复了在 5.10.1 中进行的更改。

    • 有关详细信息,请参阅问题#3638

  • 当方法级生命周期方法位于不同的包中并且与类级生命周期方法具有相同的名称时,使用@BeforeAll@AfterAll注释的包私有类级生命周期方法再次被使用@BeforeEach@AfterEach注释的方法级生命周期方法遮蔽

    • 这恢复了在 5.10.1 中进行的更改。

    • 有关详细信息,请参阅问题#3600

JUnit Vintage

无变化。

5.10.1

发布日期:2023 年 11 月 5 日

范围:自 5.10.0 以来的一些错误修复和改进。

有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的5.10.1里程碑页面。

JUnit 平台

错误修复

  • 字段谓词现在在搜索类型层次结构时被应用。这修复了ReflectionSupport中的findFields(…​)streamFields(…​)以及AnnotationSupport中的findAnnotatedFields(…​)findAnnotatedFieldValues(…​)中的错误。

  • 方法谓词现在在搜索类型层次结构时被应用。这修复了ReflectionSupport中的findMethods(…​)streamMethods(…​)以及AnnotationSupport中的findAnnotatedMethods(…​)中的错误。

JUnit Jupiter

错误修复

  • 当非静态字段位于不同的包中并且与静态字段具有相同的名称时,使用@TempDir注释的包私有静态字段不再被使用@TempDir注释的非静态字段遮蔽

  • 当方法级生命周期方法位于不同的包中并且与类级生命周期方法具有相同的名称时,使用@BeforeAll@AfterAll注释的包私有类级生命周期方法不再被使用@BeforeEach@AfterEach注释的方法级生命周期方法遮蔽

  • @TempDir在类级别(例如作为静态字段)声明时,@TempDirON_SUCCESS清理模式现在会考虑测试方法和嵌套测试的失败。

  • 用户指南中的RandomNumberExtension示例已更新,以正确支持Integer类型以及非静态字段注入。

新功能和改进

  • 关于线程中断的Assertions.assertTimeoutPreemptively的改进的 Javadoc。

  • @Disabled和条件注释的文档现在明确解释了这些注释不会被子类继承。

JUnit Vintage

错误修复

  • 修复了使用 JUnit 4 的@Ignored注释的 JUnit 3 测试类的报告。

5.10.0

发布日期:2023 年 7 月 23 日

范围

  • 将各种实验性 API 提升为稳定版

  • 新的LauncherInterceptor SPI

  • ConsoleLauncher的新testfeed详细信息模式

  • ConsoleLauncher的新子命令,用于在不执行的情况下进行测试发现

  • 测试执行的干运行模式

  • 用于第三方测试引擎的新NamespacedHierarchicalStore

  • 堆栈跟踪修剪以隐藏内部 JUnit 调用

  • 测试@Suite类中的新@SelectMethod支持。

  • 用于自定义创建临时目录的新TempDirFactory SPI

  • @RepeatedTest的失败阈值

  • 用于实现ArgumentsProviderArgumentConverter的新便捷基类

  • 类/方法选择器、@MethodSource@EnabledIf@DisabledIf的自定义类加载器支持

  • 并行执行的改进的可配置性

  • 许多错误修复和次要改进

有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的5.10.0-M15.10.0-RC15.10.0-RC25.10.0 GA里程碑页面。

JUnit 平台

弃用和重大更改

  • 使用 GraalVM 构建本机映像现在需要配置构建参数--initialize-at-build-time=org.junit.platform.launcher.core.LauncherConfig--initialize-at-build-time=org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter

  • MethodSelectorNestedMethodSelector中的getMethodParameterTypes()方法已被弃用,并被getParameterTypeNames()替换,以提高清晰度。

新功能和改进

  • 各种“实验性”API 已提升为“稳定版”,包括ModuleSelectorEngineDiscoveryListenerEngineDiscoveryRequestResolverLauncherSessionLauncherSessionListener、并行执行支持类、@Suite和相关注释等。

  • ReflectionSupport中返回List的所有实用程序方法现在都有返回Stream的对应方法。

  • ReflectionSupport中新的tryToLoadClass(…​)变体,它接受显式ClassLoader,允许使用自定义ClassLoader安排解析类。

  • ReflectionSupport.findMethod(Class<?>, String, String)现在使用提供的ClassClassLoader来加载参数类型,而不是使用默认ClassLoader。这允许使用自定义ClassLoader安排(例如 OSGi)解析参数类型。因此,DiscoverySelectors.selectMethod(Class<?>, String, String)现在也适用于自定义ClassLoader安排。

  • @Suite测试引擎中新的@SelectMethod选择器支持。

  • 现在可以通过@SelectClasses中的names属性按完全限定名称选择类。

  • ClassSelectorNestedClassSelectorMethodSelectorNestedMethodSelector的新重载构造函数,它们接受显式ClassLoader作为参数,允许选择器在像 OSGi 这样的自定义ClassLoader安排中选择类。

  • DiscoverySelectors中新的selectMethod()selectNestedMethod()变体,它们接受Class<?>…​参数类型的参数,作为提供参数类型名称作为逗号分隔字符串的类型安全替代方案。

  • 为了与 JUnit Jupiter 生命周期回调保持一致,现在使用“包装”语义调用已启动/已完成和已打开/已关闭事件的监听器方法对。这意味着当注册多个监听器时,已完成/已关闭事件方法的调用顺序与相应的已启动/已打开事件方法相反。这会影响以下监听器接口:TestExecutionListenerEngineExecutionListenerLauncherDiscoveryListenerLauncherSessionListener

  • 新的LauncherInterceptor SPI,用于拦截LauncherLauncherSessionlistener实例的创建以及前者的discoverexecute方法的调用。有关详细信息,请参阅用户指南

  • 通过配置参数支持限制并行执行的max-pool-size-factor

  • ConsoleLauncher的新testfeed详细信息模式,以简洁的格式打印测试执行事件的发生情况。

  • ConsoleLauncher的现有功能已拆分为两个子命令:execute用于执行测试,engines用于列出注册的测试引擎。

  • 已向ConsoleLauncher添加了新的discover子命令,以打印指定详细信息模式的已发现测试,而不执行它们。

  • 改进的错误消息,用于在测试发现期间检测到的循环图,使其更易于操作。

  • 从 JUnit Jupiter 引擎中提取了NamespacedHierarchicalStore,以便其他测试引擎及其扩展可以使用它。

  • 新的干运行模式,用于模拟测试执行,而无需实际运行测试。有关详细信息,请参阅用户指南

  • 现在已从失败测试生成的堆栈跟踪中修剪了来自org.junitjdk.internal.reflectsun.reflect包的调用。可以通过配置参数禁用此功能。有关详细信息,请参阅用户指南

  • TestDescriptor中的新getAncestors()方法。

JUnit Jupiter

错误修复

  • 支持@MethodSource@EnabledIf@DisabledIf的扩展现在使用从测试类获得的ClassLoader按完全限定类名加载类(如果可能)。这允许使用自定义ClassLoader安排(例如 OSGi)解析类。

  • 当将@ParameterizedTest方法的参数从完全限定类名(String)转换为Class时,现在使用声明@ParameterizedTest方法的类的ClassLoader来解析Class,而不是默认ClassLoader

弃用和重大更改

  • dynamic 并行执行策略现在默认允许线程池饱和。

  • 布尔值(如 @CsvSource 中的布尔值)的隐式类型转换现在更加严格,只允许 "true""false"(不区分大小写)的值,以使意外错误显而易见并避免潜在的混淆。

新特性和改进

  • 各种“实验性”API 已升级为“稳定”,包括 MethodOrdererClassOrdererInvocationInterceptorLifecycleMethodExecutionExceptionHandler@TempDir、并行执行注释等。

  • JAVA_22 已添加到 JRE 枚举中,用于与基于 JRE 的执行条件一起使用。

  • @Execution 中新增 reason 属性,可用于记录使用所选执行模式的原因。

  • 新增 junit.jupiter.execution.parallel.config.dynamic.max-pool-size-factor 配置参数,用于设置最大池大小系数。

  • 新增 junit.jupiter.execution.parallel.config.dynamic.saturate 配置参数,用于禁用池饱和。

  • @RepeatedTest 现在可以配置失败阈值,该阈值表示在自动跳过剩余重复之前允许的失败次数。有关详细信息,请参阅 用户指南

  • 如果 @MethodSource 与非静态工厂方法一起使用,而该方法应该是 static 的,则抛出的异常现在会为用户提供有关如何解决问题的有意义的解释。

  • @EmptySource 现在支持其他类型,包括具有公共无参数构造函数的 CollectionMap 子类型。

  • 新增 ArgumentsAccessor.getInvocationIndex() 方法,该方法提供 @ParameterizedTest 调用的索引。

  • 新增 AnnotationBasedArgumentsProvider 方便的基类,它同时实现了 ArgumentsProviderAnnotationConsumer

  • 新增 AnnotationBasedArgumentConverter 方便的基类,它同时实现了 ArgumentConverterAnnotationConsumer

  • @TempDir 现在可以作为元注释使用,以创建自定义的组合注释。有关详细信息,请参阅 用户指南 中的 @JimfsTempDir 示例。

  • @TempDir 现在可以成功清理 Windows 上设置为只读的文件和目录。

  • 新增 TempDirFactory SPI,用于自定义 @TempDir 扩展创建临时目录的方式。有关详细信息,请参阅 用户指南

  • 用户指南 现在包含 RandomNumberExtension 的示例实现,以改进通过 @ExtendWith 在字段上注册扩展的文档。

  • 用户指南和 Javadoc 中现在更详细地记录了 TestWatcher 实现的适用范围。

  • DisplayNameGenerator 方法现在允许返回 null,以指示回退到默认的显示名称生成器。

JUnit Vintage

无变化。

5.9.3

发布日期:2023 年 4 月 26 日

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

有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的 5.9.3 里程碑页面。

JUnit Platform

无变化。

JUnit Jupiter

错误修复

  • 现在验证了本地 @MethodSource 工厂方法名称的参数类型。例如,@MethodSource("myFactory(example.NonexistentType)") 现在将导致异常,指出无法将 example.NonexistentType 解析为有效类型。

  • 本地 @MethodSource 工厂方法名称中参数类型的语法现在支持规范数组名称,例如,您现在可以指定 int[](如 @MethodSource("myFactory(int[])"))而不是二进制名称 [I(如 @MethodSource("myFactory([I)")(该名称已支持)和 @MethodSource("myFactory(java.lang.String[])") 而不是 @MethodSource("myFactory([Ljava.lang.String;)")

  • 用于查找 @MethodSource 工厂方法的搜索算法现在对本地限定方法名称和重载工厂方法的完全限定方法名称应用一致的语义。

  • @ParameterizedTest 调用名称的 {displayName} 占位符不再使用 java.text.MessageFormat 解析。因此,@ParameterizedTest 方法的显示名称中的任何文本都将以未修改的形式包含在调用显示名称中。例如,Kotlin 方法名称和通过 @DisplayName 配置的自定义显示名称现在可以包含撇号(')以及类似于 MessageFormat 元素的文本,例如 {0}{data}

  • 无法删除的文件(在清理通过 @TempDir 创建的临时目录时)抛出的异常现在包含根本原因。

  • 为了向后兼容,生命周期方法允许再次声明为 private;但是,强烈建议不要对生命周期方法使用 private 可见性,并且将在将来的版本中禁止使用。

新特性和改进

  • 用于查找 @MethodSource 工厂方法的搜索算法现在在无法通过限定名称(不带参数列表)找到工厂方法时回退到宽松的搜索语义,并且在无法找到唯一工厂方法时提供更好的诊断信息。

JUnit Vintage

无变化。

5.9.2

发布日期:2023 年 1 月 10 日

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

有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的 5.9.2 里程碑页面。

JUnit Platform

错误修复

  • 当提供无效的 ParallelExecutionConfiguration 时,不再意外地使用基于 Java 7 的 ForkJoinPool 构造函数。相反,将针对无效配置抛出异常,从而防止无效配置被静默忽略。

新特性和改进

  • 新增 TestPlan.getTestIdentifier(UniqueId)TestPlan.getChildren(UniqueId) 方法,以避免在测试执行期间不必要地解析唯一 ID。

  • 支持通过配置参数限制并行执行的 max-pool-size

  • 套件发现现在会忽略在测试套件中遇到的循环,并在 CONFIG 级别记录一条信息消息,而不是抛出异常。

JUnit Jupiter

错误修复

  • 新增 @MethodSource 语法,用于明确选择重载的本地工厂方法,而不指定其完全限定名称。

弃用和重大变更

  • fixed 并行执行策略现在默认允许线程池饱和。

新特性和改进

  • JAVA_21 已添加到 JRE 枚举中,用于与基于 JRE 的执行条件一起使用。

  • 新增 junit.jupiter.execution.parallel.config.fixed.max-pool-size 配置参数,用于设置最大池大小。

  • 新增 junit.jupiter.execution.parallel.config.fixed.saturate 配置参数,用于禁用池饱和。

JUnit Vintage

错误修复

  • Parameterized 测试现在在与 Enclosed 运行器结合使用时被正确报告。

5.9.1

发布日期:2022 年 9 月 20 日

范围

  • 新增 @EnabledInNativeImage@DisabledInNativeImage 注释,用于在 GraalVM 本地映像中进行测试。

  • 自 5.9.0 以来修复的次要错误和增强功能

有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的 5.9.1 里程碑页面。

JUnit Platform

错误修复

  • ReflectionSupport.findMethods(…​) 现在返回一组不同的方法。

  • 在 GraalVM 本地映像中执行不再需要 --initialize-at-build-time 用于 OpenTestReportGeneratingListener

JUnit Jupiter

错误修复

  • @CsvSource 中通过 value 属性提供的 @ParameterizedTest 的标头现在在 useHeadersInDisplayName 属性设置为 true 时被正确解析。

  • 配置了引用从多个接口继承的工厂方法的 @MethodSource 注释的 @ParameterizedTest 方法不再出现异常,指出找到了多个具有相同名称的工厂方法。

  • 配置了引用其名称与同一类中其他非工厂方法相同的工厂方法的 @MethodSource 注释的 @ParameterizedTest 方法不再出现异常,指出找到了多个具有相同名称的工厂方法。

  • 使用 ThreadMode.SEPARATE 应用超时的方法抛出的断言失败现在被正确报告。

新特性和改进

  • 新增 @EnabledInNativeImage@DisabledInNativeImage 注释,用于在 GraalVM 本地映像中启用和禁用测试。

JUnit Vintage

无变化。

5.9.0

发布日期:2022 年 7 月 26 日

范围

  • 以新的 Open Test Reporting 格式的 XML 报告

  • @TempDir 的可配置清理模式

  • @Timeout 的可配置线程模式

  • 基于操作系统体系结构的条件执行

  • 新增 TestInstancePreConstructCallback 扩展 API

  • 通过 ExecutableInvoker 对自定义扩展方法进行可重用参数解析

  • @MethodSource 方法的参数注入

  • 新增 IterationSelector

  • ConsoleLauncher 的各种改进

  • 许多错误修复和次要改进

有关完整详细信息,请参阅在线的 5.9.0 版本说明