執行整合測試
雖然您可以很容易地從測試(或測試套件)本身啟動您的 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>
這樣的設定現在可以使用 failsafe-plugin 來執行您的整合測試,正如您所期望的那樣。
應用程式在一個單獨的程序中啟動,並使用 JMX 與應用程式通訊。預設情況下,外掛使用埠 9001。如果您需要配置 JMX 埠,請參閱專用示例。 |
您還可以配置更高階的設定,以便在設定了特定屬性時跳過整合測試,請參閱專用示例。
不使用 Spring Boot 父 POM 的 Failsafe
Spring Boot 的父 POM,spring-boot-starter-parent,將 Failsafe 的 <classesDirectory> 配置為 ${project.build.outputDirectory}。如果沒有此配置,Failsafe 將無法載入您的應用程式類,因為它會導致 Failsafe 使用已編譯的類而不是重新打包的 jar。如果您不使用父 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:4.0.0
啟動一個 Spring 應用程式。與 run 目標相反,這不會阻塞,並允許其他目標在應用程式上執行。此目標通常用於整合測試場景,其中應用程式在測試套件之前啟動並在之後停止。
可選引數
| 名稱 | 型別 | 預設值 |
|---|---|---|
|
|
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
|
|
|
|
|
|
||
|
||
|
|
|
|
||
|
||
|
|
|
|
||
|
|
|
|
|
|
|
引數詳情
addResources
直接將 Maven 資源新增到類路徑,這允許即時原地編輯資源。重複的資源將從 target/classes 中移除,以防止在呼叫 ClassLoader.getResources() 時它們出現兩次。請考慮將 spring-boot-devtools 新增到您的專案中,因為它提供了此功能以及更多功能。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
additionalClasspathElements
應新增到類路徑的額外類路徑元素。一個元素可以是包含類和資源的目錄,也可以是 jar 檔案。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
classesDirectory
包含應用於執行應用程式的類和資原始檔的目錄。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
commandlineArguments
應傳遞給應用程式的命令列引數。使用空格分隔多個引數,並確保將多個值用引號括起來。當指定時,優先於 #arguments。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
environmentVariables
應與用於執行應用程式的分叉程序關聯的環境變數列表。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
excludeGroupIds
要排除的 groupId 名稱的逗號分隔列表(精確匹配)。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
excludes
要排除的 artifact 定義集合。Exclude 元素定義了強制的 groupId 和 artifactId 元件以及可選的 classifier 元件。當配置為屬性時,值應以逗號分隔,元件以冒號分隔:groupId:artifactId,groupId:artifactId:classifier
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
includes
要包含的 artifact 定義集合。Include 元素定義了強制的 groupId 和 artifactId 元件以及可選的 classifier 元件。當配置為屬性時,值應以逗號分隔,元件以冒號分隔:groupId:artifactId,groupId:artifactId:classifier
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
jmxName
自動部署的 MBean 的 JMX 名稱,用於管理 Spring 應用程式的生命週期。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
jvmArguments
應與用於執行應用程式的分叉程序關聯的 JVM 引數。在命令列上,請確保將多個值用引號括起來。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
mainClass
主類的名稱。如果未指定,將使用找到的第一個包含“main”方法的已編譯類。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
maxAttempts
檢查 Spring 應用程式是否準備就緒的最大嘗試次數。與“wait”引數結合使用,這將給出一個全域性超時值(預設為 30 秒)
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
profiles
要啟用的 Spring 配置檔案。指定 'spring.profiles.active' 引數的便捷快捷方式。在命令列上使用逗號分隔多個配置檔案。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
systemPropertyVariables
要傳遞給程序的 JVM 系統屬性列表。
名稱 |
|
|---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
spring-boot:stop
示例
整合測試的隨機埠
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