測試 GraalVM Native Images

在撰寫 native image 應用程式時,我們建議您盡可能繼續使用 JVM 來開發大部分的單元測試和整合測試。這將有助於縮短開發人員的建置時間,並讓您使用現有的 IDE 整合。透過在 JVM 上進行廣泛的測試覆蓋,您可以將 native image 測試重點放在可能不同的區域。

對於 native image 測試,您通常會希望確保以下方面運作正常

  • Spring AOT 引擎能夠處理您的應用程式,並且它將以 AOT 處理模式執行。

  • GraalVM 具有足夠的提示,可確保可以產生有效的 native image。

使用 JVM 測試預先編譯處理

當 Spring Boot 應用程式執行時,它會嘗試偵測是否以 native image 方式執行。如果以 native image 方式執行,它將使用在建置時由 Spring AOT 引擎產生的程式碼初始化應用程式。

如果應用程式在一般 JVM 上執行,則任何 AOT 產生的程式碼都會被忽略。

由於 native-image 編譯階段可能需要一段時間才能完成,因此有時在 JVM 上執行應用程式並使其使用 AOT 產生的初始化程式碼會很有用。這樣做有助於您快速驗證 AOT 產生的程式碼中沒有錯誤,並且在您的應用程式最終轉換為 native image 時沒有遺失任何內容。

若要在 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 回應。

使用 Native Build Tools 進行測試

GraalVM Native Build Tools 包含在 native image 內部執行測試的功能。當您想要深入測試應用程式的內部元件在 GraalVM native image 中是否正常運作時,這會很有幫助。

產生包含要執行之測試的 native image 可能是一項耗時的操作,因此大多數開發人員可能更喜歡在本地使用 JVM。但是,它們在 CI 管道中可能非常有用。例如,您可以選擇每天執行一次 native 測試。

Spring Framework 包含用於執行測試的預先編譯支援。所有常見的 Spring 測試功能都適用於 native image 測試。例如,您可以繼續使用 @SpringBootTest 註解。您也可以使用 Spring Boot 測試切片 來僅測試應用程式的特定部分。

Spring Framework 的 native 測試支援以以下方式運作

  • 分析測試以找出任何將需要的 ApplicationContext 實例。

  • 預先編譯處理會應用於每個應用程式上下文,並產生資產。

  • 建立 native image,產生的資產由 GraalVM 處理。

  • native image 也包含 JUnit TestEngine,並配置了已發現測試的清單。

  • 啟動 native image,觸發引擎,該引擎將執行每個測試並報告結果。

使用 Maven

若要使用 Maven 執行 native 測試,請確保您的 pom.xml 檔案使用 spring-boot-starter-parent。您應該有一個看起來像這樣的 <parent> 區段

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

spring-boot-starter-parent 宣告了一個 nativeTest 設定檔,用於配置執行 native 測試所需的執行。您可以使用命令列上的 -P 標誌來啟用設定檔。

如果您不想使用 spring-boot-starter-parent,則需要為 Spring Boot 外掛程式的 process-test-aot 目標和 Native Build Tools 外掛程式的 test 目標配置執行。

若要建置映像檔並執行測試,請使用 test 目標並啟用 nativeTest 設定檔

$ mvn -PnativeTest test

使用 Gradle

當應用 GraalVM Native Image 外掛程式時,Spring Boot Gradle 外掛程式會自動配置 AOT 測試任務。您應該檢查您的 Gradle 建置是否包含包含 org.graalvm.buildtools.nativeplugins 區塊。

若要使用 Gradle 執行 native 測試,您可以使用 nativeTest 任務

$ gradle nativeTest