測試 GraalVM 原生映像檔
在編寫原生映像應用程式時,我們建議您盡可能繼續使用 JVM 來開發大部分的單元和整合測試。這有助於縮短開發人員的建置時間,並允許您使用現有的 IDE 整合。透過 JVM 上廣泛的測試涵蓋範圍,您可以將原生映像測試集中在可能不同的區域。
對於原生映像測試,您通常需要確保以下方面可以正常運作:
-
Spring AOT 引擎能夠處理您的應用程式,並且它將以 AOT 處理模式運行。
-
GraalVM 有足夠的提示來確保可以產生有效的原生映像。
使用 JVM 測試預先 (AOT) 處理
當 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 原生建置工具包含在原生映像檔內執行測試的功能。當您想要深入測試您的應用程式內部在 GraalVM 原生映像檔中是否正常運作時,這會很有幫助。
產生包含要執行測試的原生映像檔可能是一項耗時的操作,因此大多數開發人員可能更喜歡在本機使用 JVM。然而,它們作為 CI 管道的一部分非常有用。例如,您可以選擇每天執行一次原生測試。
Spring Framework 包含用於執行測試的預先 (AOT) 支援。所有常用的 Spring 測試功能都適用於原生映像檔測試。例如,您可以繼續使用 @SpringBootTest
註釋。您也可以使用 Spring Boot 測試切片 來僅測試應用程式的特定部分。
Spring Framework 的原生測試支援以以下方式運作:
-
分析測試以找出任何需要的
ApplicationContext
執行個體。 -
將預先 (AOT) 處理應用於每個應用程式上下文,並產生資源。
-
建立原生映像檔,並由 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.0</version>
</parent>
spring-boot-starter-parent
宣告了一個 nativeTest
設定檔,該設定檔配置執行原生測試所需的執行設定。您可以使用命令列上的 -P
旗標來啟用設定檔。
如果您不想使用 spring-boot-starter-parent ,您需要為 Spring Boot 外掛程式的 process-test-aot 目標和原生建置工具外掛程式的 test 目標配置執行設定。 |
要建置映像檔並執行測試,請在啟用 nativeTest
設定檔的情況下使用 test
目標。
$ mvn -PnativeTest test