2016-03-08 75 views
3

我們有一個大型的多模塊Maven項目。我一直在試驗用-T選項加速我們的單元測試版本,並取得了一些積極的成果。不過,也有在我們的項目的一些依賴路徑是這樣的:Maven:在運行單元測試時忽略模塊間依賴關係

模塊A < - 模塊B < - 模塊C

,其中每個模塊的單元測試需要20-30分鐘。由於-T選項以其從屬順序構建模塊,因此總共需要90分鐘的構建時間。如果我可以先編譯所有模塊,然後同時運行A,B和C的測試,那麼它確實會加快構建。例如。事情是這樣的:

$ mvn -T 10 clean install -DskipTests 
$ mvn -T 10 --ignore-dependencies test 

問題:是否有Maven的這個開箱支持?

我一直在玩寫作一個小腳本的想法,它將解析mvn依賴關係的輸出:並且並行地調用「mvn test -pl A」,「mvn test -pl B」等等,但很顯然,如果Maven有一個開箱即用的解決方案,那就更好了。

我們正在使用Jenkins,所以如果有Jenkins插件或Jenkins的功能,我錯過了支持此功能的功能,那可能會有很大幫助!

:加快對A,B和C單元測試將採取工作顯著量,而且也不能保證單個模塊內的測試並行

回答

2

一個可能的解決方案是爲以下:

  • 創建一個額外的模塊,說testsuite-module
  • 添加到testsuite-module所有其它模塊的依賴關係test範圍
  • 添加到其他模塊的testsuite-module所有測試源通過Build Helper Maven Plugin及其add-test-source目標
  • 執行你的工作只有在此模塊和平行

例如,POM第二步運行測試所述testsuite-module的文件可能看起來如下:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>com.sample</groupId> 
     <artifactId>modules</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </parent> 
    <artifactId>testsuite-module</artifactId> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>build-helper-maven-plugin</artifactId> 
       <version>1.10</version> 
       <executions> 
        <execution> 
         <id>add-test-source</id> 
         <phase>generate-test-sources</phase> 
         <goals> 
          <goal>add-test-source</goal> 
         </goals> 
         <configuration> 
          <sources> 
           <source>../module-a/src/test</source> 
           <source>../module-b/src/test</source> 
          </sources> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>com.sample</groupId> 
      <artifactId>module-a</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.sample</groupId> 
      <artifactId>module-b</artifactId> 
      <version>0.0.1-SNAPSHOT</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.11</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
</project> 

它唯一的範圍是收集其它模塊的所有源的測試中,具有測試範圍/類路徑所需要的模塊,並通過例如執行它們:

mvn -pl testsuite-module test -T 10 

這將在單個測試執行中執行所有測試,因此可能會滿足您的要求。這種方法

幾個方面的考慮:

  • testsuite-module不會有任何問題爲您的項目和您也可以將它移動到CI配置文件,如果需要的話(推薦),如this SO post
  • 你解釋可能會考慮使用Build Helper插件的add-test-resource目標
  • 雖然測試名稱(在不同模塊中具有相同名稱的兩個測試用例)或測試資源上可能存在衝突,但這可能更具問題,但應該不可能把它整理出來
  • 可能會浪費時間(和適得其反)如果從相關模塊的測試將首先失敗,但是這方面已經通過您的要求預見(如假設,我想)
+0

這確實是一個很好的解決方案,沒有想到那個。 +1 – Tunaki

+0

感謝您的解決方案 - 非常好! – choover

相關問題