JUnit启动时间缓慢

8
我正在处理一个相对较小的项目(依赖项方面),每当我运行单元测试时,JVM需要加载8秒钟,然后在0.2秒内运行实际测试。
我的环境:
- Java 8 - Spring Tool Suite 3.8.1.RELEASE - JUnit 4 - Windows 8
我担心我的环境中可能有某些原因导致这个过程如此缓慢,希望有人之前遇到过并找到了问题的根源和解决方法?
例如,如果我的 PATH 环境变量非常长,这会有影响吗?
当我运行 JUnit 测试时,确切发生了什么?
我要运行的实际测试是:
public class TemplateLocationCalculatorTest {

    private TemplateLocationCalculator target = new TemplateLocationCalculator();
    
    @Test
    public void whenGivenRootReturnIndex(){
        Assert.assertEquals("index", target.calculate("/"));
    }
}

目标类是这个:

public class TemplateLocationCalculator {

    public String calculate(String string) {
        return "index";
    }

}

我相信你会同意我说这个页面加载不应该太慢。

1
@PieterDeBie 我已经看了。第二段。计算机硬件性能不应该是一个问题。 - kinbiko
1
你能对这8秒的启动过程进行分析吗?你可以尝试一下这个问题中描述的方法,记录各种JVM引导事件。 - apangin
如果你在命令行界面外部运行 mvn test,会发生什么? - vikingsteve
1
抱歉,我误读了Spring Tool Suite为Spring。那好吧,你使用Eclipse IDE吗?如果你在IntelliJ中打开测试,它会更快地运行吗? - vikingsteve
  1. 你是在运行测试还是在调试测试?
  2. 如果你运行 mvn test,会发生什么?
- Mike Nakis
显示剩余11条评论
2个回答

3

楼主在这里。

根据聊天室中的一条建议,我使用了微软进程监视器,经过很多筛选后,我发现我的电脑上运行着防病毒软件Avecto DefendPoint,并且它似乎是瓶颈所在。每当我开始一个测试时,它的运行速度只有大约25%,这对我来说似乎表明它是在我的四个内核中的一个单线程上以全速运行。由于我不是这台机器上的管理员,因此我无法禁用它以验证这个假设,但通常情况下,如果其他人也遇到这个问题,请检查是否是您的防病毒软件造成的。


-1

可能的原因是在启动期间进行组件扫描和自动装配。您可以通过为测试创建单独的config文件来限制此操作,该文件限制了组件的搜索空间,如此处所述。

在配置中,您可以使用<beans default-lazy-init="true">延迟加载bean或显式地连接bean(更详细的说明在此处

<beans ...>
    <!-- this bean will be injected into the OrderServiceTest class -->
    <bean id="target" class="TemplateLocationCalculator" />

    <!-- other beans -->
</beans>

然后在测试类中,我们指定新的配置文件:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/path/to/test-config.xml" })
public class TemplateLocationCalculatorTest {

    @Autowired
    private TemplateLocationCalculator target;

    @Test
    public void whenGivenRootReturnIndex(){
        Assert.assertEquals("index", target.calculate("/"));
    }

}

@Bean
public class TemplateLocationCalculator {

   public String calculate(String string) {
       return "index";
   }

}

1
这里没有使用Spring框架,而是使用Spring工具套件(STS)。或者你是指即使运行一个简单的JUnit测试,STS在底层也会自动装配(autowiring)吗? - Roland
STS是一个预安装Spring IDE组件的插件 - 在底层仍然是Spring。即使它只是一个JUnit测试,应用程序仍然需要构建和运行,以便自动装配仍然发生。这里的想法是简化这个过程。 - Aimee Borda
好的...我的意思是这里没有直接使用Spring。如果STS在幕后进行一些耦合操作,从而导致进程变慢,而你的答案解决了这个问题,那就没问题了;-) - Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接