测试 GraalVM 原生镜像

在编写原生镜像(native image)应用程序时,我们建议您尽可能继续使用 JVM 来开发大部分的单元测试和集成测试。 这有助于缩短开发者的构建时间,并允许您使用现有的 IDE 集成工具。 在 JVM 上实现广泛的测试覆盖后,您便可以将原生镜像测试集中在那些可能存在差异的区域。spring-doc.cadn.net.cn

对于原生镜像测试,您通常需要确保以下几个方面能够正常工作:spring-doc.cadn.net.cn

  • Spring AOT 引擎能够处理您的应用程序,并使其以 AOT 处理后的模式运行。spring-doc.cadn.net.cn

  • GraalVM 拥有足够的提示信息,以确保能够生成有效的原生镜像。spring-doc.cadn.net.cn

使用 JVM 测试提前(Ahead-of-Time)处理

当 Spring Boot 应用程序运行时,它会尝试检测自己是否以原生镜像(native image)方式运行。 如果是以原生镜像方式运行,它将使用 Spring AOT 引擎在构建时生成的代码来初始化应用程序。spring-doc.cadn.net.cn

如果应用程序运行在标准的 JVM 上,则任何 AOT 生成的代码都会被忽略。spring-doc.cadn.net.cn

由于 native-image 编译阶段可能需要较长时间才能完成,有时在 JVM 上运行应用程序但让它使用 AOT 生成的初始化代码会很有帮助。 这样做有助于你快速验证 AOT 生成的代码中是否存在错误,以及当你的应用程序最终转换为原生镜像时是否缺少任何内容。spring-doc.cadn.net.cn

要在 JVM 上运行 Spring Boot 应用程序并使其使用 AOT 生成的代码,可以将 spring.aot.enabled 系统属性设置为 truespring-doc.cadn.net.cn

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

如果你的应用程序启动时将 spring.aot.enabled 属性设置为 true,那么当它被转换为原生镜像(native image)时,你就有更高的信心确保其能够正常工作。spring-doc.cadn.net.cn

您还可以考虑针对正在运行的应用程序运行集成测试。 例如,您可以使用 Spring WebClient 来调用您的应用程序 REST 端点。 或者,您也可以考虑使用像 Selenium 这样的项目来检查应用程序的 HTML 响应。spring-doc.cadn.net.cn

使用原生构建工具进行测试

GraalVM Native Build Tools 支持在原生镜像(native image)内部运行测试。 当你希望深入测试应用程序内部是否能在 GraalVM 原生镜像中正常工作时,这一功能会非常有用。spring-doc.cadn.net.cn

生成包含待运行测试的原生镜像可能是一个耗时的操作,因此大多数开发人员可能会更倾向于在本地使用 JVM。 然而,它们在 CI(持续集成)流水线中却非常有用。 例如,你可以选择每天运行一次原生测试。spring-doc.cadn.net.cn

Spring Framework 包含用于运行测试的提前(AOT)支持。 所有常规的 Spring 测试功能都适用于原生镜像测试。 例如,您可以继续使用 @SpringBootTest 注解。 您还可以使用 Spring Boot 测试切片 来仅测试应用程序的特定部分。spring-doc.cadn.net.cn

Spring Framework 的原生测试支持以以下方式工作:spring-doc.cadn.net.cn

使用 Maven

要使用 Maven 运行原生测试,请确保您的 pom.xml 文件使用了 spring-boot-starter-parent。 您应该有一个类似如下的 <parent> 部分:spring-doc.cadn.net.cn

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

spring-boot-starter-parent 定义了一个 nativeTest 配置文件(profile),用于为 Spring Boot 插件和 Native Build Tools 插件提供必要的配置。 首先,你需要在模块中添加这两个插件以启用该功能。 只有在启用了 nativeTest 配置文件时,你的测试才会以原生模式执行。 你可以使用命令行中的 -P 标志来激活配置文件。spring-doc.cadn.net.cn

如果你不想使用 spring-boot-starter-parent,则需要为 Spring Boot 插件的 process-test-aot 目标和 Native Build Tools 插件的 test 目标配置执行(executions)。

要构建镜像并运行测试,请使用 test 目标,并激活 nativeTest 配置文件:spring-doc.cadn.net.cn

$ mvn -PnativeTest test

使用 Gradle

当应用 GraalVM Native Image 插件时,Spring Boot Gradle 插件会自动配置 AOT 测试任务。 您应检查您的 Gradle 构建文件中是否包含一个 plugins 块,并且其中包含 org.graalvm.buildtools.nativespring-doc.cadn.net.cn

要使用 Gradle 运行原生测试,可以使用 nativeTest 任务:spring-doc.cadn.net.cn

$ gradle nativeTest