【问题标题】:Run maven test in parallel without waiting for sibling module dependencies并行运行 maven 测试而不等待兄弟模块依赖项
【发布时间】:2020-11-18 02:11:40
【问题描述】:

我有一个多模块 maven 项目,其中模块之间有很多依赖关系。我曾尝试并行运行我的测试,但由于模块没有经过深思熟虑并且相互高度依赖,我基本上没有时间获得,因为它们最终仍然按顺序执行。

现在,在完全运行测试之前,我有一个构建项目的阶段,以便我可以在测试的同时应用其他静态分析工具。

我的问题是:鉴于我的模块已经编译,我可以不告诉 maven 使用这些预编译的类并行运行测试,而不是等待依赖模块先运行它们的测试吗? 例如。目前,如果我有一个依赖于模块 B 的模块 A,模块 B 将在 A 启动之前先执行其所有测试。由于我已经构建了 A 和 B,因此我无需保留此限制。

我目前运行测试的方式类似于: mvn -f project-parent/pom.xml surefire:test 其中 project parent 是我所有其他模块的父模块。为简洁起见,我省略了配置文件和其他参数。

谢谢!

编辑:此时我正在尝试使用 junit 或 surefire 避免类/套件级别的并行化,并且只想以并行方式测试模块。

【问题讨论】:

  • 为什么在运行测试之前先构建模块?为什么不直接使用mvn clean install 构建所有内容?
  • @JFabianMeier 我按照全新安装的方式做了一些事情,但最初跳过了测试,以便我可以与其他代码分析工具并行运行测试。
  • 如果它们相互高度依赖,要么重构依赖的位,要么在未使用的情况下删除依赖。正如您已经说过的那样,旨在使本质上是 List 而不是有些平衡的 Tree 的反应堆构建并行化是行不通的。
  • 这是一个功能而不是一个错误。如果模块 B 未能通过测试,那么模块 A 也可能无法通过测试,因为模块 B 无法正常工作。您的测试结果中会出现额外的噪音,这可能会使您或您的团队更难确定真正的问题。
  • @JohnBrandli 完全可以理解,而且我确信在许多情况下都很有用 - 但它也可以禁用吗? :)

标签: java maven testing build parallel-builds


【解决方案1】:

Child 测试可以通过,但Parent 测试失败。这可能是因为 Child 需要 Parent 但它的大部分测试 mock Parent 假设它有效!如果这种情况并行且不按顺序发生,我认为 Maven 不知道该怎么做。你希望 Maven 可以成为一个完整的 CI 管道,而实际上它只是一个构建工具。

但是:

如果您的测试速度慢到足以让您提出这个 SO 问题,那么它们可能是可以提取到新模块中的集成测试 (<module>-tests)。

A -> A-tests
A -> B
     B -> B-tests
     B -> C
          C -> C-tests

这意味着 A、B 和 C src/test/* 快速完成并且可以“正常”运行,而较慢的 <module>-tests 不相互依赖,这意味着 Maven 可以仅使用 mvn test -TC 将它们并行化。

【讨论】:

    【解决方案2】:

    如果你绝对必须,你也可以使用maven.test.skip 属性来跳过编译测试。 maven.test.skip 受到 SurefireFailsafeCompiler 插件的认可。

       mvn -T 8 -f project-parent/pom.xml surefire:test -Dmaven.test.skip=true
    

    【讨论】:

    • 嗯,重点是不要跳过测试 :) 我想运行它们,但不必等待依赖模块先运行它们的测试。也许我误解了你的答案。如果这样做,我的测试是否会以不关心模块间依赖关系的并行方式运行?
    • 您的要求是跳过编译并并行运行测试。 8个线程是在同一个模块上工作还是在不同的模块上工作并不重要,因为8个线程所做的工作是一样的
    • 根据我的理解(和测试),上面描述的 -T 参数配置永远不会在 8 个线程上构建/测试单个模块,它将允许构建具有完全依赖项的独立模块/模块,1 个线。根据:cwiki.apache.org/confluence/display/MAVEN/… 声明:此构建模式分析项目的依赖关系图并根据项目的依赖关系图安排可以并行构建的模块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2018-09-08
    • 2016-01-12
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多