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 ネイティブビルドツールには、ネイティブイメージ内でテストを実行する機能が含まれています。これは、アプリケーションの内部が GraalVM ネイティブイメージで機能することを深くテストしたい場合に役立ちます。

実行するテストを含むネイティブイメージを生成する操作は時間がかかる可能性があるため、ほとんどの開発者はおそらく JVM をローカルで使用することを好みます。ただし、CI パイプラインの一部として非常に役立つ場合があります。例: ネイティブテストを 1 日 1 回実行することを選択する場合があります。

Spring Framework には、テスト実行の事前サポートが含まれています。通常の Spring Test 機能はすべて、ネイティブイメージテストで動作します。たとえば、@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.1</version>
</parent>

spring-boot-starter-parent は、ネイティブテストの実行に必要な実行を構成する nativeTest プロファイルを宣言します。コマンドラインで -P フラグを使用して、プロファイルをアクティブ化できます。

spring-boot-starter-parent を使用したくない場合は、Spring Boot プラグインから process-test-aot ゴールの実行を構成し、Native Build Tools プラグインから test ゴールを構成する必要があります。

イメージをビルドしてテストを実行するには、nativeTest プロファイルをアクティブにして test ゴールを使用します。

$ mvn -PnativeTest test

Gradle の使用

Spring Boot Gradle プラグインは、GraalVM ネイティブイメージプラグインが適用されると、AOT テストタスクを自動的に構成します。Gradle ビルドに org.graalvm.buildtools.native を含む plugins ブロックが含まれていることを確認する必要があります。

Gradle を使用してネイティブテストを実行するには、nativeTest タスクを使用できます。

$ gradle nativeTest