本文档包含自 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。
-
5.10.1
发布日期:2023 年 11 月 5 日
范围:自 5.10.0 以来的一些错误修复和改进。
有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的5.10.1里程碑页面。
JUnit 平台
错误修复
-
字段谓词现在在搜索类型层次结构时被应用。这修复了
ReflectionSupport
中的findFields(…)
和streamFields(…)
以及AnnotationSupport
中的findAnnotatedFields(…)
和findAnnotatedFieldValues(…)
中的错误。-
有关详细信息,请参阅问题 3532。
-
-
方法谓词现在在搜索类型层次结构时被应用。这修复了
ReflectionSupport
中的findMethods(…)
和streamMethods(…)
以及AnnotationSupport
中的findAnnotatedMethods(…)
中的错误。-
有关详细信息,请参阅问题 3498。
-
JUnit Jupiter
错误修复
-
当非静态字段位于不同的包中并且与静态字段具有相同的名称时,使用
@TempDir
注释的包私有静态字段不再被使用@TempDir
注释的非静态字段遮蔽。-
有关详细信息,请参阅问题 3532。
-
-
当方法级生命周期方法位于不同的包中并且与类级生命周期方法具有相同的名称时,使用
@BeforeAll
或@AfterAll
注释的包私有类级生命周期方法不再被使用@BeforeEach
或@AfterEach
注释的方法级生命周期方法遮蔽。-
有关详细信息,请参阅问题 3498。
-
-
当
@TempDir
在类级别(例如作为静态字段)声明时,@TempDir
的ON_SUCCESS
清理模式现在会考虑测试方法和嵌套测试的失败。 -
用户指南中的
RandomNumberExtension
示例已更新,以正确支持Integer
类型以及非静态字段注入。
5.10.0
发布日期:2023 年 7 月 23 日
范围
-
将各种实验性 API 提升为稳定版
-
新的
LauncherInterceptor
SPI -
ConsoleLauncher
的新testfeed
详细信息模式 -
ConsoleLauncher
的新子命令,用于在不执行的情况下进行测试发现 -
测试执行的干运行模式
-
用于第三方测试引擎的新
NamespacedHierarchicalStore
-
堆栈跟踪修剪以隐藏内部 JUnit 调用
-
测试
@Suite
类中的新@SelectMethod
支持。 -
用于自定义创建临时目录的新
TempDirFactory
SPI -
@RepeatedTest
的失败阈值 -
用于实现
ArgumentsProvider
和ArgumentConverter
的新便捷基类 -
类/方法选择器、
@MethodSource
、@EnabledIf
和@DisabledIf
的自定义类加载器支持 -
并行执行的改进的可配置性
-
许多错误修复和次要改进
有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的5.10.0-M1、5.10.0-RC1、5.10.0-RC2和5.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
。 -
MethodSelector
和NestedMethodSelector
中的getMethodParameterTypes()
方法已被弃用,并被getParameterTypeNames()
替换,以提高清晰度。
新功能和改进
-
各种“实验性”API 已提升为“稳定版”,包括
ModuleSelector
、EngineDiscoveryListener
、EngineDiscoveryRequestResolver
、LauncherSession
、LauncherSessionListener
、并行执行支持类、@Suite
和相关注释等。 -
ReflectionSupport
中返回List
的所有实用程序方法现在都有返回Stream
的对应方法。 -
ReflectionSupport
中新的tryToLoadClass(…)
变体,它接受显式ClassLoader
,允许使用自定义ClassLoader
安排解析类。 -
ReflectionSupport.findMethod(Class<?>, String, String)
现在使用提供的Class
的ClassLoader
来加载参数类型,而不是使用默认ClassLoader
。这允许使用自定义ClassLoader
安排(例如 OSGi)解析参数类型。因此,DiscoverySelectors.selectMethod(Class<?>, String, String)
现在也适用于自定义ClassLoader
安排。 -
@Suite
测试引擎中新的@SelectMethod
选择器支持。 -
现在可以通过
@SelectClasses
中的names
属性按完全限定名称选择类。 -
ClassSelector
、NestedClassSelector
、MethodSelector
和NestedMethodSelector
的新重载构造函数,它们接受显式ClassLoader
作为参数,允许选择器在像 OSGi 这样的自定义ClassLoader
安排中选择类。 -
DiscoverySelectors
中新的selectMethod()
和selectNestedMethod()
变体,它们接受Class<?>…
参数类型的参数,作为提供参数类型名称作为逗号分隔字符串的类型安全替代方案。 -
为了与 JUnit Jupiter 生命周期回调保持一致,现在使用“包装”语义调用已启动/已完成和已打开/已关闭事件的监听器方法对。这意味着当注册多个监听器时,已完成/已关闭事件方法的调用顺序与相应的已启动/已打开事件方法相反。这会影响以下监听器接口:
TestExecutionListener
、EngineExecutionListener
、LauncherDiscoveryListener
和LauncherSessionListener
。 -
新的
LauncherInterceptor
SPI,用于拦截Launcher
和LauncherSessionlistener
实例的创建以及前者的discover
和execute
方法的调用。有关详细信息,请参阅用户指南。 -
通过配置参数支持限制并行执行的
max-pool-size-factor
。 -
ConsoleLauncher
的新testfeed
详细信息模式,以简洁的格式打印测试执行事件的发生情况。 -
ConsoleLauncher
的现有功能已拆分为两个子命令:execute
用于执行测试,engines
用于列出注册的测试引擎。 -
已向
ConsoleLauncher
添加了新的discover
子命令,以打印指定详细信息模式的已发现测试,而不执行它们。 -
改进的错误消息,用于在测试发现期间检测到的循环图,使其更易于操作。
-
从 JUnit Jupiter 引擎中提取了
NamespacedHierarchicalStore
,以便其他测试引擎及其扩展可以使用它。 -
新的干运行模式,用于模拟测试执行,而无需实际运行测试。有关详细信息,请参阅用户指南。
-
现在已从失败测试生成的堆栈跟踪中修剪了来自
org.junit
、jdk.internal.reflect
和sun.reflect
包的调用。可以通过配置参数禁用此功能。有关详细信息,请参阅用户指南。 -
TestDescriptor
中的新getAncestors()
方法。
JUnit Jupiter
错误修复
-
支持
@MethodSource
、@EnabledIf
和@DisabledIf
的扩展现在使用从测试类获得的ClassLoader
按完全限定类名加载类(如果可能)。这允许使用自定义ClassLoader
安排(例如 OSGi)解析类。 -
当将
@ParameterizedTest
方法的参数从完全限定类名(String
)转换为Class
时,现在使用声明@ParameterizedTest
方法的类的ClassLoader
来解析Class
,而不是默认ClassLoader
。
弃用和重大更改
-
dynamic
并行执行策略现在默认允许线程池饱和。 -
布尔值(如
@CsvSource
中的布尔值)的隐式类型转换现在更加严格,只允许"true"
或"false"
(不区分大小写)的值,以使意外错误显而易见并避免潜在的混淆。
新特性和改进
-
各种“实验性”API 已升级为“稳定”,包括
MethodOrderer
、ClassOrderer
、InvocationInterceptor
、LifecycleMethodExecutionExceptionHandler
、@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
现在支持其他类型,包括具有公共无参数构造函数的Collection
和Map
子类型。 -
新增
ArgumentsAccessor.getInvocationIndex()
方法,该方法提供@ParameterizedTest
调用的索引。 -
新增
AnnotationBasedArgumentsProvider
方便的基类,它同时实现了ArgumentsProvider
和AnnotationConsumer
。 -
新增
AnnotationBasedArgumentConverter
方便的基类,它同时实现了ArgumentConverter
和AnnotationConsumer
。 -
@TempDir
现在可以作为元注释使用,以创建自定义的组合注释。有关详细信息,请参阅 用户指南 中的@JimfsTempDir
示例。 -
@TempDir
现在可以成功清理 Windows 上设置为只读的文件和目录。 -
新增
TempDirFactory
SPI,用于自定义@TempDir
扩展创建临时目录的方式。有关详细信息,请参阅 用户指南。 -
用户指南 现在包含
RandomNumberExtension
的示例实现,以改进通过@ExtendWith
在字段上注册扩展的文档。 -
用户指南和 Javadoc 中现在更详细地记录了
TestWatcher
实现的适用范围。 -
DisplayNameGenerator
方法现在允许返回null
,以指示回退到默认的显示名称生成器。
5.9.3
发布日期:2023 年 4 月 26 日
范围:自 5.9.2 以来修复的错误和增强功能
有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的 5.9.3 里程碑页面。
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
可见性,并且将在将来的版本中禁止使用。
5.9.2
发布日期:2023 年 1 月 10 日
范围:自 5.9.1 以来修复的错误和增强功能
有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的 5.9.2 里程碑页面。
JUnit Platform
5.9.1
发布日期:2022 年 9 月 20 日
范围
-
新增
@EnabledInNativeImage
和@DisabledInNativeImage
注释,用于在 GraalVM 本地映像中进行测试。 -
自 5.9.0 以来修复的次要错误和增强功能
有关此版本所有已关闭问题和拉取请求的完整列表,请参阅 GitHub 上 JUnit 存储库中的 5.9.1 里程碑页面。
JUnit Jupiter
错误修复
-
@CsvSource
中通过value
属性提供的@ParameterizedTest
的标头现在在useHeadersInDisplayName
属性设置为true
时被正确解析。 -
配置了引用从多个接口继承的工厂方法的
@MethodSource
注释的@ParameterizedTest
方法不再出现异常,指出找到了多个具有相同名称的工厂方法。 -
配置了引用其名称与同一类中其他非工厂方法相同的工厂方法的
@MethodSource
注释的@ParameterizedTest
方法不再出现异常,指出找到了多个具有相同名称的工厂方法。 -
使用
ThreadMode.SEPARATE
应用超时的方法抛出的断言失败现在被正确报告。
5.9.0
发布日期:2022 年 7 月 26 日
范围
-
以新的 Open Test Reporting 格式的 XML 报告
-
@TempDir
的可配置清理模式 -
@Timeout
的可配置线程模式 -
基于操作系统体系结构的条件执行
-
新增
TestInstancePreConstructCallback
扩展 API -
通过
ExecutableInvoker
对自定义扩展方法进行可重用参数解析 -
@MethodSource
方法的参数注入 -
新增
IterationSelector
-
ConsoleLauncher
的各种改进 -
许多错误修复和次要改进
有关完整详细信息,请参阅在线的 5.9.0 版本说明。