Testing GraalVM Native Images

在编写本机映像应用程序时,我们建议你在可能的情况下继续使用 JVM 开发大多数单元和集成测试。这将有助于缩短开发人员的构建时间,并允许你使用现有的 IDE 集成。在 JVM 上进行广泛的测试后,你就可以重点关注本机映像测试可能有所不同的领域。 对于本机映像测试,你通常需要确保以下方面:

  • Spring AOT 引擎能够处理你的应用程序,并且它将运行于 AOT 处理模式。

  • GraalVM 有足够的提示以确保可以生成一个有效的本机映像。

Testing Ahead-of-time Processing With the JVM

当 Spring Boot 应用程序运行时,它会尝试检测它是否作为本机映像运行。如果它作为本机映像运行,它将使用 Spring AOT 引擎在构建时生成代码初始化应用程序。

如果应用程序在常规 JVM 上运行,那么会忽略任何 AOT 生成的代码。

由于 native-image 编译阶段可能需要一段时间才能完成,因此有时在 JVM 上运行应用程序但使用 AOT 生成的初始化代码很有用。这样做有助于你快速验证 AOT 生成的代码中没有错误,并且当最终将应用程序转换为本机映像后也没有遗漏任何内容。

若要在 JVM 上运行 Spring Boot 应用程序并使用 AOT 生成的代码,你可以将 spring.aot.enabled 系统属性设置为 true

例如:

$ java -Dspring.aot.enabled=true -jar myapplication.jar

你需要确保你正在测试的 jar 包含 AOT 生成的代码。对于 Maven,这意味着你应该使用 -Pnative 构建以激活 native 配置文件。对于 Gradle,你需要确保你的构建包含 org.graalvm.buildtools.native 插件。

如果你的应用程序以 spring.aot.enabled 属性设置为 true 启动,那么你更有信心在将其转换为本机映像后它能够正常工作。

你还可以考虑对正在运行的应用程序运行集成测试。例如,你可以使用 Spring WebClient 调用你的应用程序 REST 端点。或者,你可以考虑使用 Selenium 等项目来检查你的应用程序的 HTML 响应。

Testing With Native Build Tools

GraalVM Native Build Tools 包括在 native image 中运行测试的能力。在你希望深度测试应用程序的内部功能在 GraalVM native image 中的工作方式时,这会很有用。

生成包含要运行测试的 native image 可能是一项耗时的操作,因此大多数开发人员可能会更喜欢在本地使用 JVM。不过,它们作为 CI 管道的组成部分可能非常有用。例如,你可能选择每天运行一次本机测试。

Spring Framework 包括针对运行测试的预处理支持。所有常规的 Spring 测试功能都适用于本机映像测试。例如,你可以继续使用 @SpringBootTest 注释。你还可以使用 Spring Boot test slices 来仅测试应用程序的特定部分。

Spring Framework 的本机测试支持的工作方式如下:

  • 分析测试以发现所需的任何 ApplicationContext 实例。

  • 对每个应用程序上下文应用预处理,并生成资产。

  • 创建一个 native image,其中生成的资产将由 GraalVM 处理。

  • 本机映像还包括配置了已发现的测试列表的 JUnit TestEngine

  • 本机映像启动,触发引擎以运行每个测试并报告结果。

Using Maven

要使用 Maven 运行本机测试,请确保 pom.xml`文件使用 `spring-boot-starter-parent。你应该有一个与此类似的 `<parent>`部分:

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>{version-spring-boot}</version>
</parent>

`spring-boot-starter-parent`声明了一个 `nativeTest`配置文件,用于配置运行本机测试所需的执行操作。你可以使用命令行上的 `-P`标记激活配置文件。

如果不希望使用 spring-boot-starter-parent,则需要为 Spring Boot 插件的 `process-test-aot`目标和 Native Build Tools 插件的 `test`目标配置执行操作。

要构建映像并运行测试,请使用已激活 `nativeTest`配置文件的 `test`目标:

$ mvn -PnativeTest test

Using Gradle

当应用了 GraalVM 本机映像插件时,Spring Boot Gradle 插件会自动配置 AOT 测试任务。你应该检查 Gradle 构建是否包含一个包括 `org.graalvm.buildtools.native`的 `plugins`块。

要使用 Gradle 运行本机测试,可以使用 `nativeTest`任务:

$ gradle nativeTest