【问题标题】:Maven Surefire plugin + parallel buildMaven Surefire 插件 + 并行构建
【发布时间】:2016-02-20 12:54:05
【问题描述】:

在我们相当大的项目(大约 600 个 maven 模块)中,我们决定尝试 maven 的并行构建功能。所以我安装了 maven 3.3 并尝试运行单元测试。

我发现有时我们的单元测试会失败。如果我“单独”运行模块,它可以工作,当然,如果我们“按顺序”运行 maven(没有 -T 选项),它也可以工作。

所以,我认为这是由于有时测试会干扰,可能是一些静态代码或共享实例导致这些失败。

我的问题是,运行项目单元测试的最佳方式是什么? 我知道在每次测试运行时生成 JVM 的选项,但是由于我们有数千个单元测试,我担心这样的构建会永远持续下去:)

AFAIK 有 3 种可能的解决方案:

  1. 只需跳过测试,并行编译/打包/安装所有内容。然后分别运行测试。这种方法对 jenkins 来说是可行的,但对于刚刚习惯运行 mvn install

  2. 的开发人员来说,我可能会很麻烦
  3. 以某种方式扩展surefire插件,如果它失败,它将自动重新运行N次单元测试。如果测试失败,比如说 50% 的时间 - 它真的很不稳定,应该会导致整个构建失败。我不想使用 @RunWith 注释,原因有两个:有很多测试要使用这个注释更新,我们没有基类或其他东西。湾。一些测试已经包含这个注解(例如用于 power mock 或 junit 规则)

  4. 以某种方式扩展surefire插件以在不同的类加载器中运行测试。由于 maven 似乎使用相同的类加载器运行多个模块(我刚刚在两个不同的子模块中打印了类加载器的地址并确保类加载器是相同的,所以我想到了这个解决方案,地址相同)。这个解决方案看起来很有趣,但相对复杂。

在深入了解这些解决方案并与我的经理交谈之前, 如果有人可以评论其中一种解决方案/提供另一种解决方案,我将不胜感激。我只是不想重新发明轮子,希望能节省一些时间:)

提前非常感谢

【问题讨论】:

  • 说实话,最简单的答案是。修复这些测试,因为有两件事他们可能没有单元测试或做错事,正如你已经提到的......顺便说一句:我很想知道你的构建运行了多长时间,以及你为什么不早先开始使用 -T 选项Maven 的版本(3.1.1、3.2.5...)?你有多少测试?
  • 谢谢,理论上你是对的,作为 TDD 的拥护者,我完全同意你的看法:这些测试并不是真正的单元测试,而且可能正如你提到的那样,它们做错了事。然而,在一个已经有数百个这样的测试的项目中(总而言之,我们有超过一百个开发人员编写的数千个单元测试)我只是不能完全删除它们/自己修复。至于 maven 版本,这不是我的决定(否则我会使用 gradle 及其增量构建:))无论如何感谢您的评论。
  • 我知道你在说什么......我有超过 400 个模块的项目(大约 6500 个测试)......但如果这些测试没有修复,你就不能并行化它们...... . 或者它们应该被命名为不同的名称以在不同阶段将它们作为集成测试运行......但我感兴趣的是你的构建需要多长时间以及你有多少测试......

标签: java maven unit-testing junit maven-surefire-plugin


【解决方案1】:

如何在单独的 JVM 中运行每个测试类? (并且可能在其他测试中重用分叉的 JVM)。

老实说,看起来你没有试一试。查看文档https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html

只是示例的复制粘贴:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.19</version>
  <configuration>
    <forkCount>3</forkCount>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
    <systemPropertyVariables>
        <databaseSchema>MY_TEST_SCHEMA_${surefire.forkNumber}</databaseSchema>
    </systemPropertyVariables>
    <workingDirectory>FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
  </configuration>
</plugin>

顺便说一句,surefire 可以重新运行失败的测试:https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html。我只是担心你无法设置阈值。

也不是说分叉会使调试(例如,附加调试器)变得非常困难。

根据我的经验,并非所有的安全设置都与 forking 兼容,因此您可能需要在调整配置时逐步进行,以查看哪些实际有效,哪些无效。

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多