幸運的是,Maven具有針對此確切方案的內置支持,具有默認構建生命周期的以下階段(來自Maven 文檔 ):
- 集成前測試 : 執行集成測試之前所需的操作。 這可能涉及諸如設置所需環境的事情。
- 集成測試 : 如有必要,將程序包處理并部署到可以運行集成測試的環境中。
- 集成測試后 : 執行集成測試后執行所需的操作。 這可能包括清理環境。
首先,配置了maven-surefire-plugin ,以便從標準構建生命周期中排除集成測試 :
<plugin><groupId>org.apache.maven.plugins<groupId><artifactId>maven-surefire-plugin<artifactId><version>2.10<version><configuration><excludes><exclude>***IntegrationTest.java<exclude><excludes><configuration><plugin>
排除是通過螞蟻風格的路徑表達式完成的,因此所有集成測試都必須遵循此模式,并以“ IntegrationTest.java ”結尾。
接下來,使用cargo-maven2-plugin ,因為Cargo提供了對嵌入式Web服務器的頂級支持。 當然,如果服務器環境需要特定的配置,貨運也知道如何從已歸檔的軟件包中構造服務器以及如何部署到外部服務器。
<plugin><groupId>org.codehaus.cargo<groupId><artifactId>cargo-maven2-plugin<artifactId><version>1.1.3<version><configuration><wait>true<wait><container><containerId>jetty7x<containerId><type>embedded<type><container><configuration><properties><cargo.servlet.port>8080<cargo.servlet.port><properties><configuration><configuration><plugin>
定義了一個嵌入式Jetty 7 Web服務器,偵聽端口8080。請注意,將等待標記設置為true –這是因為對于較新版本的貨物(1.1.0以上),該標記的默認值已更改為由于此錯誤 ,從true到false 。 我們希望能夠通過簡單地運行mvn cargo:start來啟動項目,尤其是在開發階段,因此該標志應該處于活動狀態。 但是,在運行集成測試時,我們希望服務器啟動,先運行測試再停止,這就是為什么該標志以后會被覆蓋的原因。
為了使包 maven階段生成可部署的war文件,項目的打包必須為: <packaging> war </ packaging> 。
接下來, 將創建一個新的集成 Maven配置文件 ,以僅在該配置文件處于活動狀態時才允許運行集成測試,而不是將其作為標準構建生命周期的一部分。
<profiles><profile><id>integration<id><build><plugins>...<plugins><build><profile><profiles>
該配置文件將包含所有其余配置。
現在,Jetty服務器已配置為在集成前測試階段啟動 ,并在集成后 測試階段停止 。
<plugin><groupId>org.codehaus.cargo<groupId><artifactId>cargo-maven2-plugin<artifactId><configuration><wait>false<wait><configuration><executions><execution><id>start-server<id><phase>pre-integration-test<phase><goals><goal>start<goal><goals><execution><execution><id>stop-server<id><phase>post-integration-test<phase><goals><goal>stop<goal><goals><execution><executions><plugin>
這樣可以確保在集成測試階段之前和之后執行cargo:start目標和cargo:stop目標。 請注意,因為有兩個單獨的執行定義,所以兩個中都必須存在id元素(并且元素ID有所不同),以便Maven可以接受配置。
接下來,需要在集成配置文件中覆蓋maven-surefire-plugin配置,以便現在將包含并運行默認生命周期中排除的集成測試:
<plugins><plugin><groupId>org.apache.maven.plugins<groupId><artifactId>maven-surefire-plugin<artifactId><executions><execution><phase>integration-test<phase><goals><goal>test<goal><goals><configuration><excludes><exclude>none<exclude><excludes><includes><include>***IntegrationTest.java<include><includes><configuration><execution><executions><plugin><plugins>
有幾件事值得注意:
1. maven-surefire-plugin的測試目標是在集成測試階段執行的; 至此,Jetty已經開始部署項目,因此集成測試應該沒有問題。
2.現在,集成測試包含在執行中。 為了實現這一點,排除項也被覆蓋-這是因為Maven處理配置文件中的覆蓋插件配置的方式。 基本配置沒有被完全覆蓋,而是在配置文件中增加了新的配置元素。 因此,最初排除集成測試的原始<excludes>配置仍然存在于配置文件中,并且需要被覆蓋,否則它將與<includes>配置沖突并且測試仍然不會跑。
3.請注意,由于只有一個<execution>元素,因此不需要定義id 。
現在,整個過程可以運行:
mvn clean install -Pintegration
結論
Maven的分步配置涵蓋了設置集成過程的整個過程,這是項目生命周期的一部分。
通常將此設置為在持續集成環境中運行,最好在每次提交之后運行。 如果CI服務器已經具有運行和使用端口的服務器,則貨物配置將必須處理該情況,我將在以后的文章中介紹。
參考: 如何在baeldung博客上使用我們的JCG合作伙伴 Eugen Paraschiv 的Maven Cargo插件設置集成測試 。
翻譯自: https://www.javacodegeeks.com/2012/09/maven-cargo-plugin-for-integration.html