統合テストの実行

Spring Boot アプリケーションはテスト(またはテストスイート)自体から非常に簡単に起動できますが、ビルド自体で処理することが望ましい場合があります。Spring Boot アプリケーションのライフサイクルが統合テストを中心に適切に管理されていることを確認するには、次の例に示すように、start および stop ゴールを使用できます。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<executions>
				<execution>
					<id>pre-integration-test</id>
					<goals>
						<goal>start</goal>
					</goals>
				</execution>
				<execution>
					<id>post-integration-test</id>
					<goals>
						<goal>stop</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

このようなセットアップでは、フェイルセーフプラグイン [Apache] (英語) を使用して、期待どおりに統合テストを実行できます。

アプリケーションは別のプロセスで開始され、アプリケーションとの通信には JMX が使用されます。デフォルトでは、プラグインはポート 9001 を使用します。JMX ポートを構成する必要がある場合は、専用の例を参照してください。

特定のプロパティが設定されたときに統合テストをスキップするように、より高度なセットアップを構成することもできます。専用の例を参照してください。

Spring Boot の親 POM なしでフェイルセーフを使用する

Spring Boot の親 POM である spring-boot-starter-parent は、フェイルセーフの <classesDirectory> を ${project.build.outputDirectory} に構成します。この構成がないと、Failsafe は再パッケージ化された jar ではなくコンパイルされたクラスを使用するため、Failsafe はアプリケーションのクラスをロードできません。親 POM を使用していない場合は、次の例に示すように、同じ方法でフェイルセーフを構成する必要があります。

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-failsafe-plugin</artifactId>
	<configuration>
		<classesDirectory>${project.build.outputDirectory}</classesDirectory>
	</configuration>
</plugin>

spring-boot:start

org.springframework.boot:spring-boot-maven-plugin:3.3.1

Spring のアプリケーションを開始します。run のゴールに反して、これはブロックせず、他のゴールがアプリケーションで動作することを許可します。このゴールは、通常、テストスイートの前にアプリケーションが開始され、その後に停止される統合テストシナリオで使用されます。

必須パラメーター

名前 タイプ デフォルト

classesDirectory

File

${project.build.outputDirectory}

オプションのパラメーター

名前 タイプ デフォルト

addResources

boolean

false

additionalClasspathElements

String[]

agents

File[]

arguments

String[]

commandlineArguments

String

directories

String[]

environmentVariables

Map

excludeGroupIds

String

excludes

List

includes

List

jmxName

String

org.springframework.boot:type=Admin,name=SpringApplication

jmxPort

int

9001

jvmArguments

String

mainClass

String

maxAttempts

int

60

noverify

boolean

profiles

String[]

skip

boolean

false

systemPropertyVariables

Map

useTestClasspath

Boolean

false

wait

long

500

workingDirectory

File

パラメーターの詳細

addResources

maven リソースをクラスパスに直接追加します。これにより、リソースのライブインプレース編集が可能になります。重複するリソースは、ClassLoader.getResources() が呼び出された場合に 2 回表示されるのを防ぐために、target/classes から削除されます。代わりに spring-boot-devtools をプロジェクトに追加することを検討してください。これは、この機能とその他多くの機能を提供します。

名前

addResources

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.addResources

開始

1.0.0

additionalClasspathElements

クラスパスに追加する必要がある追加のクラスパス要素。要素は、クラスとリソースを含むディレクトリ、または jar ファイルです。

名前

additionalClasspathElements

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

spring-boot.run.additional-classpath-elements

開始

3.2.0

agents

エージェント jar へのパス。

名前

agents

タイプ

java.io.File[]

デフォルト値

ユーザープロパティ

spring-boot.run.agents

開始

2.2.0

arguments

アプリケーションに渡す必要のある引数。

名前

arguments

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

開始

1.0.0

classesDirectory

アプリケーションの実行に使用するクラスとリソースファイルを含むディレクトリ。

名前

classesDirectory

タイプ

java.io.File

デフォルト値

${project.build.outputDirectory}

ユーザープロパティ

開始

1.0.0

commandlineArguments

アプリケーションに渡す必要のあるコマンドラインからの引数。スペースを使用して複数の引数を区切り、引用符で複数の値を囲むようにしてください。指定すると、#arguments よりも優先されます。

名前

commandlineArguments

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.arguments

開始

2.2.3

directories

クラスパスに追加する必要があるクラスまたはリソースを含む追加のディレクトリ。

名前

directories

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

spring-boot.run.directories

開始

1.0.0

environmentVariables

アプリケーションの実行に使用されるフォークされたプロセスに関連付ける必要がある環境変数のリスト。

名前

environmentVariables

タイプ

java.util.Map

デフォルト値

ユーザープロパティ

開始

2.1.0

excludeGroupIds

除外する groupId 名のコンマ区切りリスト(完全一致)。

名前

excludeGroupIds

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.excludeGroupIds

開始

1.1.0

excludes

除外するアーティファクト定義のコレクション。Exclude 要素は、必須の groupId および artifactId コンポーネントとオプションの classifier コンポーネントを定義します。プロパティとして構成する場合、値はコンマで区切られ、コンポーネントはコロンで区切られる必要があります: groupId:artifactId,groupId:artifactId:classifier

名前

excludes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.excludes

開始

1.1.0

includes

含めるアーティファクト定義のコレクション。Include 要素は、必須の groupId および artifactId コンポーネントとオプションの classifier コンポーネントを定義します。プロパティとして構成する場合、値はコンマで区切られ、コンポーネントはコロンで区切られる必要があります: groupId:artifactId,groupId:artifactId:classifier

名前

includes

タイプ

java.util.List

デフォルト値

ユーザープロパティ

spring-boot.includes

開始

1.2.0

jmxName

spring アプリケーションのライフサイクルを管理する、自動的にデプロイされた MBean の JMX 名。

名前

jmxName

タイプ

java.lang.String

デフォルト値

org.springframework.boot:type=Admin,name=SpringApplication

ユーザープロパティ

開始

jmxPort

プラットフォーム MBeanServer を公開するために使用するポート。

名前

jmxPort

タイプ

int

デフォルト値

9001

ユーザープロパティ

開始

jvmArguments

アプリケーションの実行に使用されるフォークされたプロセスに関連付ける必要がある JVM 引数。コマンドラインでは、複数の値を引用符で囲んでください。

名前

jvmArguments

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.jvmArguments

開始

1.1.0

mainClass

メインクラスの名前。指定しない場合、"main" メソッドを含む最初に見つかったコンパイル済みクラスが使用されます。

名前

mainClass

タイプ

java.lang.String

デフォルト値

ユーザープロパティ

spring-boot.run.main-class

開始

1.0.0

maxAttempts

Spring アプリケーションの準備ができているかどうかを確認する最大試行回数。"wait" 引数と組み合わせると、グローバルタイムアウト値が得られます (デフォルトでは 30 秒)

名前

maxAttempts

タイプ

int

デフォルト値

60

ユーザープロパティ

spring-boot.start.maxAttempts

開始

noverify

エージェントが -noverify を必要とすることを示すフラグ。

名前

noverify

タイプ

boolean

デフォルト値

ユーザープロパティ

spring-boot.run.noverify

開始

1.0.0

profiles

アクティブにする Spring プロファイル。'spring.profiles.active' 引数を指定する便利なショートカット。コマンドラインでは、コンマを使用して複数のプロファイルを区切ります。

名前

profiles

タイプ

java.lang.String[]

デフォルト値

ユーザープロパティ

spring-boot.run.profiles

開始

1.3.0

skip

実行をスキップします。

名前

skip

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.skip

開始

1.3.2

systemPropertyVariables

プロセスに渡す JVM システムプロパティのリスト。

名前

systemPropertyVariables

タイプ

java.util.Map

デフォルト値

ユーザープロパティ

開始

2.1.0

useTestClasspath

実行時にテストクラスパスを含めるフラグ。

名前

useTestClasspath

タイプ

java.lang.Boolean

デフォルト値

false

ユーザープロパティ

spring-boot.run.useTestClasspath

開始

wait

Spring アプリケーションの準備ができているかどうかを確認する各試行の間に待機するミリ秒数。

名前

wait

タイプ

long

デフォルト値

500

ユーザープロパティ

spring-boot.start.wait

開始

workingDirectory

アプリケーションに使用する現在の作業ディレクトリ。指定しない場合、basedir が使用されます。

名前

workingDirectory

タイプ

java.io.File

デフォルト値

ユーザープロパティ

spring-boot.run.workingDirectory

開始

1.5.0

spring-boot:stop

org.springframework.boot:spring-boot-maven-plugin:3.3.1

「開始」ゴールによって開始されたアプリケーションを停止します。通常、テストスイートが完了すると呼び出されます。

オプションのパラメーター

名前 タイプ デフォルト

jmxName

String

org.springframework.boot:type=Admin,name=SpringApplication

jmxPort

int

9001

skip

boolean

false

パラメーターの詳細

jmxName

アプリケーションのライフサイクルを管理する、自動的にデプロイされた MBean の JMX 名。

名前

jmxName

タイプ

java.lang.String

デフォルト値

org.springframework.boot:type=Admin,name=SpringApplication

ユーザープロパティ

開始

jmxPort

プラットフォーム MBeanServer のルックアップに使用するポート。

名前

jmxPort

タイプ

int

デフォルト値

9001

ユーザープロパティ

開始

skip

実行をスキップします。

名前

skip

タイプ

boolean

デフォルト値

false

ユーザープロパティ

spring-boot.stop.skip

開始

1.3.2

サンプル

統合テスト用のランダムポート

Spring Boot テスト統合の優れた機能の 1 つは、Web アプリケーションに空きポートを割り当てることができることです。プラグインの start ゴールが使用されると、Spring Boot アプリケーションが個別に開始され、統合テスト自体に実際のポートを渡すことが難しくなります。

以下の例は、ビルドヘルパー Maven プラグイン (英語) を使用して同じ機能を実現する方法を示しています。

<build>
	<plugins>
		<plugin>
			<groupId>org.codehaus.mojo</groupId>
			<artifactId>build-helper-maven-plugin</artifactId>
			<executions>
				<execution>
					<id>reserve-tomcat-port</id>
					<goals>
						<goal>reserve-network-port</goal>
					</goals>
					<phase>process-resources</phase>
					<configuration>
						<portNames>
							<portName>tomcat.http.port</portName>
						</portNames>
					</configuration>
				</execution>
			</executions>
		</plugin>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<executions>
				<execution>
					<id>pre-integration-test</id>
					<goals>
						<goal>start</goal>
					</goals>
					<configuration>
						<arguments>
							<argument>--server.port=${tomcat.http.port}</argument>
						</arguments>
					</configuration>
				</execution>
				<execution>
					<id>post-integration-test</id>
					<goals>
						<goal>stop</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-failsafe-plugin</artifactId>
			<configuration>
				<systemPropertyVariables>
					<test.server.port>${tomcat.http.port}</test.server.port>
				</systemPropertyVariables>
			</configuration>
		</plugin>
	</plugins>
</build>

統合テストのいずれかで test.server.port システムプロパティを取得して、サーバーに対して適切な URL を作成できるようになりました。

JMX ポートをカスタマイズする

jmxPort プロパティにより、プラグインが Spring Boot アプリケーションとの通信に使用するポートをカスタマイズできます。

この例は、9001 がすでに使用されている場合にポートをカスタマイズする方法を示しています。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<jmxPort>9009</jmxPort>
			</configuration>
			<executions>
				<execution>
					<id>pre-integration-test</id>
					<goals>
						<goal>start</goal>
					</goals>
				</execution>
				<execution>
					<id>post-integration-test</id>
					<goals>
						<goal>stop</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
JMX ポートを構成する必要がある場合は、上記のようにグローバル構成で構成して、両方のゴールで共有されるようにしてください。

統合テストをスキップ

skip プロパティにより、Spring Boot maven プラグインの実行を完全にスキップできます。

この例は、コマンドラインプロパティを使用した統合テストをスキップし、repackage ゴールが実行されることを確認する方法を示しています。

<project>
	<properties>
		<skip.it>false</skip.it>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<id>pre-integration-test</id>
						<goals>
							<goal>start</goal>
						</goals>
						<configuration>
							<skip>${skip.it}</skip>
						</configuration>
					</execution>
					<execution>
						<id>post-integration-test</id>
						<goals>
							<goal>stop</goal>
						</goals>
						<configuration>
							<skip>${skip.it}</skip>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-failsafe-plugin</artifactId>
				<configuration>
					<skip>${skip.it}</skip>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

デフォルトでは、統合テストが実行されますが、このセットアップにより、次のようにコマンドラインで簡単に無効化できます。

$ mvn verify -Dskip.it=true