執行整合測試

雖然您可以非常輕鬆地從您的測試(或測試套件)本身啟動 Spring Boot 應用程式,但可能需要在建置本身中處理它。為了確保您的 Spring Boot 應用程式的生命週期在您的整合測試周圍得到妥善管理,您可以使用 startstop 目標,如下列範例所示

<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>

這樣的設定現在可以使用 failsafe-plugin 來執行您的整合測試,如同您預期的一樣。

應用程式會在個別的程序中啟動,並使用 JMX 與應用程式通訊。預設情況下,外掛程式使用埠 9001。如果您需要組態 JMX 埠,請參閱專門的範例

您也可以組態更進階的設定,以便在設定特定屬性時略過整合測試,請參閱專門的範例

不使用 Spring Boot 的 Parent POM 的情況下使用 Failsafe

Spring Boot 的 Parent POM,spring-boot-starter-parent,將 Failsafe 的 <classesDirectory> 組態為 ${project.build.outputDirectory}。如果沒有此組態,Failsafe 會使用已編譯的類別,而不是重新封裝的 jar,這會導致 Failsafe 無法載入您應用程式的類別。如果您未使用 parent POM,則應以相同方式組態 Failsafe,如下列範例所示

<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.5

啟動 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 資源新增至類別路徑,這允許即時就地編輯資源。重複的資源會從 target/classes 中移除,以防止它們在呼叫 ClassLoader.getResources() 時出現兩次。請考慮將 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

Agent 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

要排除的 Artifact 定義集合。Exclude 元素定義了強制性的 groupIdartifactId 組件,以及一個選用的 classifier 組件。當組態為屬性時,值應以逗號分隔,組件以冒號分隔:groupId:artifactId,groupId:artifactId:classifier

名稱

excludes

類型

java.util.List

預設值

使用者屬性

spring-boot.excludes

1.1.0

includes

要包含的 Artifact 定義集合。Include 元素定義了強制性的 groupIdartifactId 組件,以及一個選用的 classifier 組件。當組態為屬性時,值應以逗號分隔,組件以冒號分隔:groupId:artifactId,groupId:artifactId:classifier

名稱

includes

類型

java.util.List

預設值

使用者屬性

spring-boot.includes

1.2.0

jmxName

自動部署的 MBean 的 JMX 名稱,用於管理 Spring 應用程式的生命週期。

名稱

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

標記以表示 agent 需要 -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.5

停止已由 "start" 目標啟動的應用程式。通常在測試套件完成後調用。

選用參數

名稱 類型 預設值

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 測試整合的一個不錯的功能是它可以為 Web 應用程式分配一個可用埠。當使用外掛程式的 start 目標時,Spring Boot 應用程式會個別啟動,因此很難將實際埠傳遞給整合測試本身。

以下範例展示了如何使用 Build Helper Maven Plugin 實現相同的功能

<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