2016-03-08 43 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

相关问题