|
此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Boot 4.0.4! |
测试 GraalVM 原生镜像
在编写原生镜像应用程序时,我们建议您尽可能继续使用JVM来开发大部分单元测试和集成测试。 这有助于缩短开发人员的构建时间,并允许您使用现有的IDE集成。 在JVM上拥有充分的测试覆盖后,您可以将原生镜像测试的重点放在那些可能表现不同的领域。
对于原生镜像测试,您通常希望确保以下方面能够正常工作:
-
Spring AOT 引擎能够处理您的应用程序,并且它将以 AOT 处理模式运行。
-
GraalVM 提供了足够的提示,以确保能够生成有效的原生镜像。
使用 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 响应。
使用原生构建工具进行测试
GraalVM Native Build Tools 包含在原生镜像中运行测试的功能。 当你需要深入测试应用程序的内部功能在 GraalVM 原生镜像中是否正常工作时,这会非常有帮助。
生成包含待运行测试的原生镜像可能是一个耗时的操作,因此大多数开发人员可能更倾向于在本地使用JVM。 但是,它们可以作为CI流水线的一部分非常有用。 例如,你可能会选择每天运行一次原生测试。
Spring Framework 包含对运行测试的预先(ahead-of-time)支持。
所有常规的 Spring 测试功能都适用于原生镜像测试。
例如,您可以继续使用 @SpringBootTest 注解。
您还可以使用 Spring Boot 测试切片 仅测试应用程序的特定部分。
Spring Framework 的原生测试支持按以下方式工作:
-
分析测试是为了发现任何所需的
ApplicationContext实例。 -
提前处理应用于每个应用上下文,并生成相应的资源。
-
原生镜像已创建,生成的资源由 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>3.5.13-SNAPSHOT</version>
</parent>
spring-boot-starter-parent 定义了一个 nativeTest 配置文件,该配置文件为 Spring Boot 和原生构建工具插件提供了必要的配置。
首先,您需要在模块中添加这两个插件以启用该功能。
只有当 nativeTest 启用时,您的测试才会在原生模式下执行。
您可以使用命令行上的 -P 标志来激活配置文件。
如果您不想使用 spring-boot-starter-parent,则需要为 Spring Boot 插件的 process-test-aot 目标和 Native Build Tools 插件的 test 目标配置执行。 |
要构建镜像并运行测试,请使用 test 目标并激活 nativeTest 配置文件:
$ mvn -PnativeTest test