執行整合測試
雖然你可以非常輕鬆地從測試(或測試套件)本身啟動你的 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 的 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.4.5
啟動一個 spring 應用。與 run
目標不同,這個目標不會阻塞,並允許其他目標操作應用。此目標通常用於整合測試場景,在測試套件之前啟動應用並在之後停止。
可選引數
名稱 | 型別 | 預設值 |
---|---|---|
|
|
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
|
|
|
|
|
|
||
|
||
|
|
|
|
||
|
||
|
|
|
|
||
|
|
|
|
|
|
|
引數詳情
addResources
直接將 Maven 資源新增到 classpath,這允許對資源進行即時就地編輯。重複的資源會從 target/classes
中移除,以防止在呼叫 ClassLoader.getResources()
時出現兩次。請考慮在你的專案中新增 spring-boot-devtools
,因為它提供了此功能以及更多其他功能。
名稱 |
|
---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
additionalClasspathElements
應新增到 classpath 的額外 classpath 元素。元素可以是包含類和資源的目錄或 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
管理 spring 應用生命週期的自動部署 MBean 的 JMX 名稱。
名稱 |
|
---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
jvmArguments
應與用於執行應用的分叉程序關聯的 JVM 引數。在命令列上,確保將多個值用引號括起來。
名稱 |
|
---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
mainClass
主類的名稱。如果未指定,則使用找到的第一個包含 'main' 方法的編譯類。
名稱 |
|
---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
maxAttempts
檢查 spring 應用是否就緒的最大嘗試次數。與 "wait" 引數結合使用,這會提供一個全域性超時值(預設為 30 秒)。
名稱 |
|
---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
noverify
標記,表示 agent 需要 -noverify。
名稱 |
|
---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
profiles
要啟用的 spring profile。這是指定 'spring.profiles.active' 引數的便捷快捷方式。在命令列上,使用逗號分隔多個 profile。
名稱 |
|
---|---|
型別 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
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