2

我正在開發一個大型的多模塊Maven項目。每個模塊都有快速的單元測試(使用Surefire插件),許多模塊的集成測試都很慢(使用Failsafe插件)。在多模塊Maven項目中構建所有模塊後,如何運行集成測試?

我想通過在所有模塊構建並進行單元測試後運行來自所有模塊的集成測試,加快「簡單」構建失敗(編譯錯誤和單元測試失敗)的反饋。

你能提出一個實現這個目標的好方法嗎?

回答

0

下面是一個解決方案,它完全符合我的要求:使用Failsafe插件僅運行集成測試,無需將測試移出自然場所或重新編譯以運行測試。

mvn install -DskipITs 
mvn failsafe:integration-test 

我們得到Maven發佈工程的工件到本地目錄。然後,我們可以使用它作爲第二步的存儲庫。在第二步中,我們將調用我們需要的目標,並從本地存儲庫中抓取工件。

同樣的事情適用於神火(mvn surefire:test),如果你需要單獨運行單元測試。

我不得不承認,我沒有完全理解Maven模型,因此它的工作原理。互聯網似乎一致認爲這種事情是無法完成的(見這裏的其他答案),但它絕對是爲我工作的。

+0

這不會執行單元測試,對吧?如果你這樣做,默認情況下跳過集成測試可能會更好(在父POM中設置插件配置),並在任何時候手動執行它們。 –

+1

@VivekChavda謝謝。我修復了使用'-DskipITs'的說明。 –

0

簡短的回答可能是將故障安全插件移動到配置文件中。

由於maven本身並不帶有default mapping for the failsafe plugin我認爲它在您的父pom或(更糟?)公司父pom中啓用。

方法是創建配置文件以啓用集成測試,並僅在需要時啓用該配置文件。爲了避免浪費,此配置文件可能會禁用surefire測試,以免重新執行它們。如果他們反正很快,那可能不是問題。在這種情況下,重新執行它們以啓動。

我認爲可以將其提取到配置文件中。我對maven配置文件的一般規則是,他們不允許更改產生的工件(他們可以,但通常會變得雜亂)。在這種情況下,您添加另一個執行步驟。所以這不應該傷害。只需確保文件中啓動切割釋放時:)

+0

但是在這種情況下運行的集成測試時,我們會重新編譯 - 是正確的(或至少通過所有的檢查運行是否需要編譯和依賴下載)?我會檢查一下這會增加多少時間。謝謝。 –

+0

yes直至集成測試的所有階段都將再次運行。所以也編譯(代碼生成,資源處理)。如果因爲某種原因需要一段時間,我會與其他答案一起去:)(請記住,當測試位於代碼本身之外時,測量IT代碼覆蓋率有點麻煩) – wemu

1

所有模塊的運行集成測試後,所有的模塊已建成和單元測試

爲了滿足這一要求的可能解決方案是有一個額外的(可選)模塊提供集成測試,也就是說,所有的集成測試都應該移到這個模塊中,這個模塊可以通過配置文件添加到默認構建中。

<profiles> 
    <profile> 
     <id>it</id> 
     <modules> 
     ... 
     <module>it-module</module> 
     </modules> 
    </profile> 
</profiles> 

爲了把它作爲構建的Maven Reactor的最後一步,該模塊還應該依賴於所有其它模塊(可能會隱含已經是這種情況)。

該模塊實際上是唯一提供maven-failsafe-plugin配置和設置的模塊。此外,在使用嵌入式服務器進行測試時(例如Jetty),它可能會變得更有意義:服務器將僅在構建該模塊期間創建並關閉,而不是在每個需要它的模塊中進行加速完成這個整合階段。

作爲構建的最後一個模塊,只有在以前的模塊上沒有單元測試失敗的情況下,並且只有當it配置文件處於活動狀態時(例如在CI構建期間),才能確保達到該狀態。

+0

謝謝。我不是這個想法的忠實粉絲,因爲我們的大多數集成測試自然被限定爲單個模塊(或其中的一小部分),而不是執行所有模塊的端到端測試。我想我們可以引入並行模塊 - 每個現有模塊都有一個集成測試模塊;但我不願意爲構建增加這麼多的複雜性。 –

相關問題