|
此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4! |
测试 GraalVM 原生镜像
在编写原生镜像(native image)应用程序时,我们建议您尽可能继续使用 JVM 来开发大部分的单元测试和集成测试。 这有助于缩短开发者的构建时间,并允许您使用现有的 IDE 集成工具。 在 JVM 上实现广泛的测试覆盖后,您便可以将原生镜像测试集中在那些可能存在差异的区域。
对于原生镜像测试,您通常需要确保以下几个方面能够正常工作:
-
Spring AOT 引擎能够处理您的应用程序,并使其以 AOT 处理后的模式运行。
-
GraalVM 拥有足够的提示信息,以确保能够生成有效的原生镜像。
使用 JVM 测试提前(Ahead-of-Time)处理
当 Spring Boot 应用程序运行时,它会尝试检测自己是否以原生镜像(native image)方式运行。 如果是以原生镜像方式运行,它将使用 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,那么当它被转换为原生镜像(native image)时,你就有更高的信心确保其能够正常工作。
您还可以考虑针对正在运行的应用程序运行集成测试。
例如,您可以使用 Spring WebClient 来调用您的应用程序 REST 端点。
或者,您也可以考虑使用像 Selenium 这样的项目来检查应用程序的 HTML 响应。
使用原生构建工具进行测试
GraalVM Native Build Tools 支持在原生镜像(native image)内部运行测试。 当你希望深入测试应用程序内部是否能在 GraalVM 原生镜像中正常工作时,这一功能会非常有用。
生成包含待运行测试的原生镜像可能是一个耗时的操作,因此大多数开发人员可能会更倾向于在本地使用 JVM。 然而,它们在 CI(持续集成)流水线中却非常有用。 例如,你可以选择每天运行一次原生测试。
Spring Framework 包含用于运行测试的提前(AOT)支持。
所有常规的 Spring 测试功能都适用于原生镜像测试。
例如,您可以继续使用 @SpringBootTest 注解。
您还可以使用 Spring Boot 测试切片 来仅测试应用程序的特定部分。
Spring Framework 的原生测试支持以以下方式工作:
-
分析测试是为了发现任何将需要的
ApplicationContext实例。 -
提前处理(Ahead-of-time processing)会应用于每个这些应用上下文,并生成相应的资源。
-
原生镜像已创建,生成的资源由 GraalVM 处理。
-
本机镜像还包含配置了已发现测试列表的 JUnit
TestEngine。 -
原生镜像已启动,触发引擎运行每个测试并报告结果。
使用 Maven
要使用 Maven 运行原生测试,请确保您的 pom.xml 文件使用了 spring-boot-starter-parent。
您应该有一个类似如下的 <parent> 部分:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.5-SNAPSHOT</version>
</parent>
spring-boot-starter-parent 定义了一个 nativeTest 配置文件(profile),用于为 Spring Boot 插件和 Native Build Tools 插件提供必要的配置。
首先,你需要在模块中添加这两个插件以启用该功能。
只有在启用了 nativeTest 配置文件时,你的测试才会以原生模式执行。
你可以使用命令行中的 -P 标志来激活配置文件。
如果你不想使用 spring-boot-starter-parent,则需要为 Spring Boot 插件的 process-test-aot 目标和 Native Build Tools 插件的 test 目标配置执行(executions)。 |
要构建镜像并运行测试,请使用 test 目标,并激活 nativeTest 配置文件:
$ mvn -PnativeTest test