[英]JUnit Tests: Why is Maven (Surefire) so much slower than running on Eclipse?
我正在开发一个相当大的应用程序,在套件上有大约260k LOC和大约1800个单元测试。 一点背景:
SpringJUnit4ClassRunner
来运行测试 forkCount
等于1, reuseForks
等于true)。 这样做我确信我正在使用Spring的静态上下文缓存的优点(在每个测试中重用相同的ApplicationContext
) 当我们在开发虚拟机上运行测试时,使用Oracle JDK 7u79 / 80,我们看到了非常快速的测试。 例如,具有50多种测试方法的相当大的测试类需要大约1:30m(包括上下文初始化时间)才能运行。
我们的基本Dev VM类似于:
我们使用Jenkins作为CI服务器,Maven(3.2)负责构建过程。 我们有Master + 2 Slaves架构。 所有虚拟机完全相同:
还记得那些通常需要1:30分钟才能运行Eclipse的测试吗? 在服务器上,他们需要超过15分钟才能运行! 这是我已经尝试过的事情(到目前为止没有成功。):
最重要的是,为什么Surefire的执行比在Eclipse上运行JUnit要慢得多? 我现在已经在这几天刮过头了,这真的开始惹恼我了! 当解决方案似乎如此接近但是它到目前为止,我讨厌它。
我无法在我的Dev机器上使用Maven进行测试,因为我无法分配所需的所有内存,但是运行大块的类(不是整个1.8k测试套件)仍然比在Eclipse上运行慢得多。
我理解Maven有所有这些阶段等等,但差别不应该是这么大。 你不同意吗?
任何输入都将受到高度赞赏。 我可以提供您认为必要的更多信息!
PS:Surefire v2.17,Maven 3.2.2,JUnit 4.12,Spring Test 3.2.13
非常感谢!
更新1
我尝试在CI服务器上停用JaCoCo以查看它是否影响了构建时间。 它没有。 执行时间保持不变。
您可以尝试通过在本地运行mvn test来重现远程surefire运行。 对于分叉,你确定你使用相同的设置运行吗?
我知道surefire的fork设置非常复杂并且在一段时间内有所改变(详情请参阅此处: https ://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and -parallel-execution.html )。
如果测试每次都分叉并且不重用forks,那么SpringTestRunner可能会花费很长时间来反复初始化应用程序。
你确定这是真正放慢速度的可靠测试吗?
我在这方面取得了一些进展。 如上所述,这是一个多模块(20+)Maven应用程序。 我们将所有测试分开放在一个模块上,但Surefire的配置是在父POM上完成的,而不是在测试模块的POM上完成的。
在尝试了所有内容之后,我们决定单独将测试执行配置带到此模块,跳过所有其他模块。 这使套件执行从大约45'到22'。 我们对此感到头疼,一旦我们了解了发生了什么,我将再次发布。
TL; DR: 此图片解释了一切。 (偏离主题,安全工作)
感谢您的输入!
我知道这是一个旧线程,但它可能仍然很有趣:如果你的工作负载使用了很多stdout或stderr,那么surefire将创建三倍于你输出的大数组,以便将你的非转义输出保存到它们中。 这比使用eclipse或gradle执行相同的测试需要花费更多的时间。
我创建了一个分支https://github.com/DaGeRe/maven-surefire ,并将看看是否可以将其合并到surefire中。 使用修补的插件,我的个人测试从大约1100毫秒到大约370毫秒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.