測試 GraalVM Native Images

在編寫 Native Image 應用時,我們建議儘可能繼續使用 JVM 來開發絕大多數的單元測試和整合測試。這有助於減少開發人員的構建時間,並允許你使用現有的 IDE 整合。在 JVM 上進行廣泛的測試覆蓋後,你就可以將 Native Image 測試重點放在可能存在差異的領域。

對於 Native Image 測試,你通常需要確保以下方面正常工作:

  • Spring AOT 引擎能夠處理你的應用,並且它將在 AOT 處理模式下執行。

  • GraalVM 擁有足夠的提示資訊來確保能夠生成有效的 Native Image。

使用 JVM 測試提前編譯處理 (AOT)

當一個 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 profile。對於 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 包含對執行測試的提前編譯 (AOT) 支援。所有常規的 Spring 測試特性都適用於 Native Image 測試。例如,你可以繼續使用 @SpringBootTest 註解。你還可以使用 Spring Boot 測試分片 來僅測試應用的特定部分。

Spring Framework 的 Native 測試支援工作方式如下:

  • 對測試進行分析以發現所需的 ApplicationContext 例項。

  • 對每個應用上下文應用提前編譯處理 (AOT),並生成資源。

  • 建立一個 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.4.5</version>
</parent>

spring-boot-starter-parent 聲明瞭一個 nativeTest profile,該 profile 配置了執行 Native 測試所需的執行。你可以使用命令列上的 -P 標誌啟用 profile。

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

要構建映象並執行測試,請使用 test 目標並激活 nativeTest profile

$ mvn -PnativeTest test

使用 Gradle

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

要使用 Gradle 執行 Native 測試,你可以使用 nativeTest 任務

$ gradle nativeTest