对于最新的稳定版本,请使用 Spring Boot 3.4.0! |
测试 GraalVM 原生镜像
在编写本机映像应用程序时,我们建议您尽可能继续使用 JVM 来开发大多数单元和集成测试。 这将有助于缩短开发人员的构建时间,并允许您使用现有的 IDE 集成。 通过在 JVM 上实现广泛的测试覆盖,您可以将本机映像测试的重点放在可能不同的区域。
对于本机映像测试,您通常希望确保以下方面正常工作:
-
Spring AOT 引擎能够处理您的应用程序,并且它将在 AOT 处理模式下运行。
-
GraalVM 有足够的提示来确保可以生成有效的原生镜像。
使用 JVM 测试预先处理
当 Spring Boot 应用程序运行时,它会尝试检测它是否作为本机映像运行。 如果它作为本机映像运行,它将使用 Spring AOT 引擎在构建期间生成的代码初始化应用程序。
如果应用程序在常规 JVM 上运行,则忽略任何 AOT 生成的代码。
由于编译阶段可能需要一段时间才能完成,因此有时在 JVM 上运行应用程序,但让它使用 AOT 生成的初始化代码是有用的。
这样做有助于您快速验证 AOT 生成的代码中没有错误,并且在应用程序最终转换为本机映像时没有遗漏任何内容。native-image
要在 JVM 上运行 Spring Boot 应用程序并使其使用 AOT 生成的代码,可以将 system 属性设置为。spring.aot.enabled
true
例如:
$ java -Dspring.aot.enabled=true -jar myapplication.jar
您需要确保正在测试的 jar 包含 AOT 生成的代码。
对于 Maven,这意味着您应该使用 构建 来激活配置文件。
对于 Gradle,您需要确保您的构建包含插件。-Pnative native org.graalvm.buildtools.native |
如果应用程序开始时将属性设置为 ,则您更确信它在转换为本机映像时将正常工作。spring.aot.enabled
true
您还可以考虑针对正在运行的应用程序运行集成测试。
例如,您可以使用 Spring WebClient
来调用您的应用程序 REST 端点。
或者,您可以考虑使用像 Selenium 这样的项目来检查应用程序的 HTML 响应。
使用原生构建工具进行测试
GraalVM Native Build Tools 能够在原生映像中运行测试。 当您想深入测试应用程序的内部结构是否在 GraalVM 原生映像中工作时,这可能很有帮助。
生成包含要运行的测试的本机映像可能是一项耗时的操作,因此大多数开发人员可能更愿意在本地使用 JVM。 但是,它们作为 CI 管道的一部分非常有用。 例如,您可以选择每天运行一次本机测试。
Spring Framework 包括对运行测试的预先支持。
所有常用的 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.3.6</version>
</parent>
声明一个配置文件,用于配置运行本机测试所需的执行。
您可以使用命令行上的 标志激活配置文件。spring-boot-starter-parent
nativeTest
-P
如果您不想使用,则需要为 Spring Boot 插件中的目标和 Native Build Tools 插件中的目标配置执行。spring-boot-starter-parent process-test-aot test |
要构建映像并运行测试,请在配置文件处于活动状态的情况下使用目标:test
nativeTest
$ mvn -PnativeTest test