gpt4 book ai didi

java - Maven Surefire 插件 + 并行构建

转载 作者:行者123 更新时间:2023-11-30 08:07:18 25 4
gpt4 key购买 nike

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

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

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

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

据我所知,有 3 种可能的解决方案:

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

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

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

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

提前致谢

最佳答案

如何在单独的 JVM 中运行每个测试类? (并可能在其他测试中重用 fork 的 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 .我只是担心您无法设置阈值。

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

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

关于java - Maven Surefire 插件 + 并行构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33785968/

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