執行整合測試
雖然您可以非常輕鬆地從您的測試(或測試套件)本身啟動 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.3.5
啟動 Spring 應用程式。與 run
目標相反,這不會封鎖,並允許其他目標對應用程式進行操作。此目標通常用於整合測試情境,其中應用程式會在測試套件之前啟動,並在之後停止。
選用參數
名稱 | 類型 | 預設值 |
---|---|---|
|
|
|
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
|
|
|
|
|
|
||
|
||
|
|
|
|
||
|
||
|
|
|
|
||
|
|
|
|
|
|
|
參數詳細資訊
addResources
直接將 Maven 資源新增至類別路徑,這允許即時就地編輯資源。重複的資源會從 target/classes
中移除,以防止它們在呼叫 ClassLoader.getResources()
時出現兩次。請考慮將 spring-boot-devtools
新增至您的專案,因為它提供了此功能以及更多功能。
名稱 |
|
---|---|
類型 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
additionalClasspathElements
應新增至類別路徑的其他類別路徑元素。元素可以是包含類別和資源的目錄,或是 jar 檔。
名稱 |
|
---|---|
類型 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
classesDirectory
包含應用程式執行時應使用的類別和資源檔的目錄。
名稱 |
|
---|---|
類型 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
commandlineArguments
應傳遞至應用程式的命令列引數。使用空格分隔多個引數,並確保將多個值包在引號之間。指定時,優先於 #arguments
。
名稱 |
|
---|---|
類型 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
directories
應新增至類別路徑的其他包含類別或資源的目錄。
名稱 |
|
---|---|
類型 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
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 秒)
名稱 |
|
---|---|
類型 |
|
預設值 |
|
使用者屬性 |
|
自 |
noverify
標記以表示 agent 需要 -noverify。
名稱 |
|
---|---|
類型 |
|
預設值 |
|
使用者屬性 |
|
自 |
|
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