首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Maven:在运行单元测试时忽略模块间的依赖关系。

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

Stack Overflow用户
提问于 2016-03-08 19:07:27
回答 1查看 489关注 0票数 5

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

模A <-模B <-模C

每个模块的单元测试需要20-30分钟。由于-T选项按其依赖的顺序构建模块,这将导致90分钟的总构建时间。如果我能够首先编译所有模块,然后并行运行A、B和C的测试,那么它将真正加快构建速度。例如:就像这样:

代码语言:javascript
运行
复制
$ mvn -T 10 clean install -DskipTests
$ mvn -T 10 --ignore-dependencies test

问题:Maven对此有现成的支持吗?

我一直在尝试编写一个很小的脚本来解析mvn依赖项的输出:树并并行调用"mvn测试-pl A“、"mvn测试-pl B”等等,但是很明显,如果Maven有一个开箱即用的解决方案,那就更好了。

我们正在使用Jenkins,所以如果有一些Jenkins插件,或者Jenkins的特性,而我错过了支持它的功能,那可能会有很大帮助!

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-08 21:58:10

可能的解决办法如下:

  • 创建一个额外的模块,比如testsuite-module
  • 将所有其他模块作为testsuite-module作用域中的依赖项添加到test
  • 通过testsuite-module及其构建Helper Maven插件目标将其他模块的所有测试源添加到add-test-source
  • 仅在此模块上执行作业的第二步,并并行运行测试。

例如,testsuite-module的POM文件可能如下所示:

代码语言:javascript
运行
复制
<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>

它的唯一作用域是收集其他模块的所有源测试,在测试范围/类路径中包含所需的模块,并通过以下方式执行它们:

代码语言:javascript
运行
复制
mvn -pl testsuite-module test -T 10

这将在一次测试执行中执行所有测试,因此可能满足您的要求。

关于这一办法的考虑很少:

  • testsuite-module对您的项目是无害的,您也可以将其移动到CI配置文件(如果需要的话)(并建议使用),如这是如此的帖子中所解释的
  • 您也可以考虑使用Build Helper插件的add-test-resource目标。
  • 您可能在测试名称(不同模块中具有相同名称的两个测试用例)或测试资源上存在冲突,但这可能是一个更大的问题,但不应该不可能解决。
  • 如果依赖模块的测试首先失败,那么您可能会浪费时间(而且会适得其反),但是您的需求已经预见到了这个方面(我想这是假设)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35875897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档