gpt4 book ai didi

Maven:在运行单元测试时忽略模块间依赖关系

转载 作者:行者123 更新时间:2023-12-03 21:39:48 25 4
gpt4 key购买 nike

我们有一个大型的多模块 Maven 项目。我一直在尝试使用 -T 选项加速我们的单元测试构建,并取得了一些积极的结果。但是,我们的项目中有一些依赖路径是这样的:

模块 A <- 模块 B <- 模块 C

每个模块的单元测试需要 20-30 分钟。由于 -T 选项按依赖顺序构建模块,因此总构建时间为 90 分钟。如果我可以先编译所有模块,然后并行运行 A、B 和 C 的测试,那真的会加快构建速度。例如。像这样的东西:

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

问题 : Maven 是否有开箱即用的支持?

我一直在考虑编写一个小脚本来解析 mvn 依赖项的输出:tree 并并行调用“mvn test -pl A”、“mvn test -pl B”等等,但显然如果 Maven有一个更可取的开箱即用解决方案。

我们正在使用 Jenkins,所以如果有一些 Jenkins 插件或我错过的 Jenkins 功能支持这一点,那将有很大帮助!

注意:加速 A、B 和 C 的单元测试需要大量的工作,并且不能保证单个模块中的测试是可并行的

最佳答案

一个可能的解决方案如下:

  • 创建一个附加模块,例如 testsuite-module
  • 添加到 testsuite-module所有其他模块作为 test 中的依赖项范围
  • 添加到 testsuite-module其他模块的所有测试源通过Build Helper Maven Plugin及其 add-test-source 目标
  • 仅在此模块上执行作业的第二步并并行运行测试

  • 例如, testsuite-module 的 POM 文件可能如下所示:
    <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 中所述
  • 您也可以考虑使用 add-test-resource Build Helper 插件的目标
  • 您可能在测试名称(不同模块中具有相同名称的两个测试用例)或测试资源上存在冲突,这可能是一个更大的问题,但应该不是不可能解决
  • 如果依赖模块的测试首先失败,您可能会浪费时间(并且会适得其反),但是您的要求已经预见到了这一方面(假设,我想)
  • 关于Maven:在运行单元测试时忽略模块间依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35875897/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com