在我们相当大的项目(大约600个maven模块)中,我们决定尝试maven的并行构建功能。所以我安装了maven 3.3并尝试运行单元测试。
我发现有时我们的单元测试失败了。如果我单独运行模块,它就可以工作,当然如果我们按顺序运行maven(没有-T选项)它也可以工作。
所以,我认为这是因为有时测试会干扰,可能是某些静态代码或共享实例会导致这些失败。
我的问题是,运行项目单元测试的最佳方法是什么? 我知道在每次测试运行时产生JVM的选项,但由于我们有数千个单元测试,我担心这样的构建会永远持续下去:)
AFAIK有3种可能的解决方案:
只需跳过测试,并行编译/打包/安装所有内容。然后单独运行测试。这种方法对于詹金斯来说是可行的,但对于习惯于运行 mvn install
以某种方式扩展surefire插件,如果失败,它将自动重新运行N次单元测试。如果测试失败,说50%的次数 - 它真的不稳定,应该导致整个构建失败。我不想使用 @RunWith 注释,原因有两个:a。有很多测试要使用此注释进行更新,我们没有基类或其他东西。湾某些测试已经包含此注释(例如,用于电源模拟或junit规则)
以某种方式扩展surefire插件以在不同的类加载器中运行测试。我想到了这个解决方案,因为maven似乎使用相同的类加载器运行多个模块(我只是在两个不同的子模块中放置2个测试打印类加载器的地址,并确保类加载器是相同的,地址相同)。这个解决方案看起来很有趣但相对复杂。
在深入了解这些解决方案并与我的经理交谈之前, 如果有人可以评论其中一个解决方案/提供另一个解决方案,我将不胜感激。我只是不想重新发明轮子,希望能节省一些时间:)
提前多多感谢
答案 0 :(得分:3)
如何在单独的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可以使调试(例如,附加调试器)非常困难。
根据我的经验,并非所有的万无一失的设置都与分叉兼容,因此您可能需要一步一步地调整配置,以查看实际工作和不工作的内容。