测试的提前编译(AOT)支持
本章介绍使用 Infra TestContext Framework 进行集成测试时的 Infra 提前编译(AOT)支持。
测试支持在 Infra 核心 AOT 支持 的基础上扩展了以下特性。
-
构建时检测当前项目中使用 TestContext 框架加载
ApplicationContext的所有集成测试。-
对基于 JUnit Jupiter 与 JUnit 4 的测试类提供显式支持,同时对使用 Infra 核心测试注解的 TestNG 以及其他测试框架提供隐式支持——前提是这些测试通过已在当前项目注册的 JUnit Platform
TestEngine运行。
-
-
构建时 AOT 处理:对当前项目中每个唯一的测试
ApplicationContext进行 AOT 处理的刷新。 -
运行时 AOT 支持:在 AOT 运行模式下,Infra 集成测试使用 AOT 优化后的
ApplicationContext,并透明地参与 上下文缓存。
默认情况下,所有测试在 AOT 模式下启用。不过,你可以通过
@DisabledInAotMode
注解,选择性地在 AOT 模式下禁用整个测试类或某个测试方法。
使用 JUnit Jupiter 时,可以通过 @EnabledInNativeImage 与 @DisabledInNativeImage
注解在 GraalVM 原生镜像中选择性启用或禁用测试。注意 @DisabledInAotMode 也会在
GraalVM 原生镜像中禁用被标注的测试类或测试方法,这一点与 JUnit Jupiter 的
@DisabledInNativeImage 注解一致。
|
默认情况下,构建时 AOT 处理遇到错误会抛出异常,整体流程将立即失败。 如果希望构建时 AOT 处理在遇到错误后继续执行,可以禁用 可以在命令行或构建脚本中将 JVM 系统属性 |
|
AOT 模式不支持 |
要为 GraalVM 原生镜像提供测试专用的运行时提示,你可以使用以下方式。
-
实现自定义
TestRuntimeHintsRegistrar并通过META-INF/config/aot.factories进行全局注册。 -
实现自定义
RuntimeHintsRegistrar并通过META-INF/config/aot.factories全局注册,或在测试类上通过@ImportRuntimeHints进行局部注册。 -
在测试类上标注
@Reflective或@RegisterReflectionForBinding。 -
参见 Runtime Hints 了解 Infra 核心运行时提示与注解支持详情。
|
|
如果你实现了自定义 ContextLoader,它必须实现
AotContextLoader,
以提供 AOT 构建时处理与运行时执行支持。注意,TODAY Framework 与 Infra App 提供的
所有上下文加载器实现都已实现 AotContextLoader。
如果你实现了自定义 TestExecutionListener,它必须实现
AotTestExecutionListener
才能参与 AOT 处理。示例可参考 infra-test 模块中的 SqlScriptsTestExecutionListener。