簡體   English   中英

Maven Surefire插件+並行構建

[英]Maven Surefire plugin + parallel build

在我們相當大的項目(大約600個maven模塊)中,我們決定嘗試使用maven的並行構建功能。 因此,我已經安裝了maven 3.3,並嘗試運行單元測試。

我發現有時候我們的單元測試會失敗。 如果我“單獨”運行模塊,則可以使用,當然,如果我們“順序”運行maven(無-T選項),則也可以使用。

因此,我認為這是由於有時測試會干擾,可能是某些靜態代碼或共享實例導致了這些失敗。

我的問題是,運行項目的單元測試的最佳方法是什么? 我知道可以在每次測試運行時生成JVM的選項,但是由於我們有成千上萬的單元測試,所以我擔心這樣的構建將永遠持續下去:)

AFAIK有3種可能的解決方案:

  1. 只需跳過測試,並行編譯/打包/安裝所有內容。 然后分別運行測試。 這種方法對於jenkins來說是可行的,但是對於那些習慣於運行mvn install的開發人員來說,我可能會很麻煩。

  2. 以某種方式擴展了surefire插件,使其在失敗時將自動重新運行N次單元測試。 如果測試失敗,請說50%的次數-這確實很不穩定,應該會導致整個構建失敗。 由於兩個原因,我不希望使用@RunWith注釋: 僅有大量測試可以使用此批注進行更新,而我們沒有基類或其他東西。 一些測試已經包含此注釋(例如,用於電源模擬或junit規則)

  3. 以某種方式擴展surefire插件以在不同的類加載器中運行測試。 由於Maven似乎使用同一個類加載器運行多個模塊(我剛剛在兩個不同的子模塊中放置了兩個打印類加載器地址的測試,並確保類加載器相同,所以我想到了該解決方案)。地址相同)。 該解決方案看起來很有趣,但是相對復雜。

在探討任何一種解決方案並與我的經理交談之前,我希望能有人對這些解決方案之一發表評論/提供另一種解決方案。 我只是不想重新發明輪子,希望節省一些時間:)

在此先多謝

如何在單獨的JVM中運行每個測試類? (並可能在其他測試中重用分叉的JVM)。

老實說,您似乎沒有為此開槍。 查看文檔https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html

只是示例的復制粘貼:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.19</version>
  <configuration>
    <forkCount>3</forkCount>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
    <systemPropertyVariables>
        <databaseSchema>MY_TEST_SCHEMA_${surefire.forkNumber}</databaseSchema>
    </systemPropertyVariables>
    <workingDirectory>FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
  </configuration>
</plugin>

順便說一句,surefire可以重新運行失敗的測試: https : //maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html 我只是擔心您將無法設置閾值。

同樣不是說分叉會使調試(例如,附加調試器)變得非常困難。

根據我的經驗,並非所有的surefire設置都與fork兼容,因此您可能需要逐步調整配置以查看實際的工作方式和無效的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM