Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试:为什么Maven(Surefire)比在Eclipse上运行慢得多?_Java_Maven_Unit Testing_Junit_Spring Test - Fatal编程技术网

Java JUnit测试:为什么Maven(Surefire)比在Eclipse上运行慢得多?

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的静态上下文缓存的优点(在每次测试中重

我正在开发一个相当大的应用程序,在套件上有大约260k的LOC和大约1800个单元测试。一点背景:

  • 多模块Maven项目
  • 所有测试都在一个单独的模块上运行,JaCoCo用于检查覆盖率
  • 测试集中在一些套件中,然后这些套件包括在Surefire的配置中
  • 使用
    SpringJUnit4ClassRunner
    运行测试
  • Surefire当前配置为使用相同的VM进行构建和测试(
    forkCount
    等于1,而
    reuseForks
    等于true)。这样做我确信我使用了Spring的静态上下文缓存的优点(在每次测试中重复使用相同的
    ApplicationContext
  • 当我们使用OracleJDK7U79/80在开发虚拟机上运行测试时,我们会看到非常快的测试。例如,一个有50多个测试方法的相当大的测试类需要大约1:30m(包括上下文初始化时间)才能运行

    我们的基本开发虚拟机类似于:

    • 双核i5处理器(带超线程,so 4虚拟线程)
    • 8GB内存
    • 中档SATA硬盘(5k或7k2 RPM)
    • 在客户端模式下运行Oracle JDK的Windows 7 x64(-Client)
    我们使用Jenkins作为CI服务器,Maven(3.2)负责构建过程。我们有一个主从结构。所有虚拟机都完全相同:

    • 8 Xeon E5芯(实芯)
    • 8GB内存
    • 为虚拟机提供服务的SSD LUN(1.2GB/s平均吞吐量)
    • Debian Linux 8 x64
    • 服务器模式下的Oracle JDK
    还记得那些在Eclipse上运行通常需要1:30分钟的测试吗?在服务器上运行它们需要15分钟以上!以下是我已经尝试过的(到目前为止还没有成功):

    • 将MAVEN_选项设置为固定堆大小(2GB堆)、较大的永久空间、调优的GC设置、/dev/uradom作为随机种子
    • 安装了一个32位JDK以使用我们在开发人员机器上使用的相同客户端模式
    • 优化了Surefire的配置以增加内存、优化GC等(因为我不再使用分叉VM来运行测试,所以我将其删除,因为它不会改变任何东西)
    归根结底,为什么Surefire的执行速度比在Eclipse上运行JUnit慢得多,有什么具体原因吗?这几天我都在为之挠头,真的开始烦我了!我讨厌解决方案如此接近,但却如此遥远

    我无法在我的开发机器上使用Maven进行测试,因为我无法分配完成测试所需的所有内存,但运行大量类(不是整个1.8k测试套件)仍然比在Eclipse上运行慢得多

    我知道Maven有所有这些阶段等等,但区别不应该这么大。你不同意吗

    如有任何意见,我们将不胜感激。我可以提供您认为必要的更多信息

    PS:SurefireV2.17、Maven 3.2.2、JUnit 4.12、Spring测试3.2.13

    非常感谢

    更新1


    我尝试在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服务器