Java JUnit测试:为什么Maven(Surefire)比在Eclipse上运行慢得多?
我正在开发一个相当大的应用程序,在套件上有大约260k的LOC和大约1800个单元测试。一点背景:Java JUnit测试:为什么Maven(Surefire)比在Eclipse上运行慢得多?,java,maven,unit-testing,junit,spring-test,Java,Maven,Unit Testing,Junit,Spring Test,我正在开发一个相当大的应用程序,在套件上有大约260k的LOC和大约1800个单元测试。一点背景: 多模块Maven项目 所有测试都在一个单独的模块上运行,JaCoCo用于检查覆盖率 测试集中在一些套件中,然后这些套件包括在Surefire的配置中 使用SpringJUnit4ClassRunner运行测试 Surefire当前配置为使用相同的VM进行构建和测试(forkCount等于1,而reuseForks等于true)。这样做我确信我使用了Spring的静态上下文缓存的优点(在每次测试中重
SpringJUnit4ClassRunner
运行测试forkCount
等于1,而reuseForks
等于true)。这样做我确信我使用了Spring的静态上下文缓存的优点(在每次测试中重复使用相同的ApplicationContext
)- 双核i5处理器(带超线程,so 4虚拟线程)
- 8GB内存
- 中档SATA硬盘(5k或7k2 RPM)
- 在客户端模式下运行Oracle JDK的Windows 7 x64(-Client)
- 8 Xeon E5芯(实芯)
- 8GB内存
- 为虚拟机提供服务的SSD LUN(1.2GB/s平均吞吐量)
- Debian Linux 8 x64
- 服务器模式下的Oracle JDK
- 将MAVEN_选项设置为固定堆大小(2GB堆)、较大的永久空间、调优的GC设置、/dev/uradom作为随机种子
- 安装了一个32位JDK以使用我们在开发人员机器上使用的相同客户端模式
- 优化了Surefire的配置以增加内存、优化GC等(因为我不再使用分叉VM来运行测试,所以我将其删除,因为它不会改变任何东西)
我尝试在CI服务器上停用JaCoCo,以查看它是否影响构建时间。没有。执行时间保持不变。您可以通过在本地运行mvn测试来尝试重现远程surefire运行。关于分叉,您确定使用相同的设置运行吗 我知道surefire的fork设置非常复杂,并且随着时间的推移会发生一些变化(请参见此处的详细说明:) 如果每次测试都使用fork,并且没有重用fork,那么SpringTestRunner可能会花费很长时间反复初始化应用程序
你确定是surefire测试真的让事情变慢了吗 我在这方面取得了一些进展。如上所述,这是一个多模块(20+)Maven应用程序。我们将所有测试分离在一个模块上,但Surefire的配置是在父POM上进行的,而不是在测试模块的POM上 在尝试了一切之后,我们决定将测试执行配置单独带到这个模块,跳过所有其他模块。这使套件的执行时间从45英尺增加到22英尺。我们对此感到困惑,一旦我们明白了发生了什么,我将再次在这里发布 TL;博士:
谢谢大家的意见 我知道这是一个古老的线程,但它可能仍然很有趣:如果您的工作负载使用了大量的stdout或stderr,那么surefire将创建三倍于您的输出的大数组,以便将未经扫描的输出保存到它们中。这会导致surefire比在eclipse或gradle中执行相同的测试花费更多的时间
我创建了一个fork,并将看看是否有可能将其合并到surefire中。我的个人测试使用补丁插件从~1100毫秒到~370毫秒。找到一个可以在maven和Eclipse中运行测试的环境,以消除构建工具或环境的问题区域。确保在这两种情况下都使用(或不使用)JaCoCo,因为它会大大降低测试执行速度。如果这些都没有帮助的话,试着比较有和没有Jenkins.Hi@ogondza的maven构建性能。谢谢你的意见。你认为JaCoCo能如此大幅度地增加执行时间吗?我将尝试禁用Surefire上的代理,并将结果发布在此处。谢谢!我从来没有遇到过这么大的不同。通常在surefire和IDE之间几秒钟。如果有那么慢的东西。。。真奇怪。CI服务器上是否有需要扫描每个新jar文件的病毒扫描程序?(我在本地机器上看到过这种情况,在CI服务器上需要40分钟而不是10分钟)嗨@wemu-nah。由于这是DMZ上的VM,我们没有安装任何可能导致此问题的防病毒或安全守护程序。谢谢你的意见!如果在命令行上运行构建(而不是在jenkings内部),它仍然很慢吗?(以验证ci服务器