测试的提前编译(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 处理在遇到错误后继续执行,可以禁用 failOnError 模式, 从而将错误记录为 WARN 级别,或在 DEBUG 级别记录更详细的信息。

可以在命令行或构建脚本中将 JVM 系统属性 infra.test.aot.processing.failOnError 设置为 false 来禁用 failOnError 模式。或者,也可以通过 TodayStrategies 机制设置该属性。

AOT 模式不支持 @ContextHierarchy 注解。

要为 GraalVM 原生镜像提供测试专用的运行时提示,你可以使用以下方式。

TestRuntimeHintsRegistrar API 是核心 RuntimeHintsRegistrar API 的补充。 如果需要为测试支持注册不特定于某个测试类的全局提示,建议优先实现 RuntimeHintsRegistrar,而不是使用测试专用 API。

如果你实现了自定义 ContextLoader,它必须实现 AotContextLoader, 以提供 AOT 构建时处理与运行时执行支持。注意,TODAY Framework 与 Infra App 提供的 所有上下文加载器实现都已实现 AotContextLoader

如果你实现了自定义 TestExecutionListener,它必须实现 AotTestExecutionListener 才能参与 AOT 处理。示例可参考 infra-test 模块中的 SqlScriptsTestExecutionListener