如何使用Spring Boot运行所有测试类,但仅启动嵌入式Tomcat一次?

时间:2018-08-15 07:20:53

标签: java spring spring-boot tomcat

我的项目有很多Test类,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RefererCheckerTest {
...

每次我要运行所有测试类时,每个人都会显示如下日志:

  

2018-08-15 14:59:31.104 [main]信息   o.s.b.c.e.t.TomcatEmbeddedServletContainer   [TomcatEmbeddedServletContainer.java:201] -Tomcat在端口上启动:   63003(http)

     

2018-08-15 14:59:31.112 [main]信息   c.b.s.m.filter.OAuthLoginTest [StartupInfoLogger.java:57]-已启动   OAuthLoginTest只需27.571秒(JVM运行33.229)

似乎初始化一个Spring Boot项目及其嵌入式Tomcat会花费很多时间。如果我有100个测试类,则运行所有测试类将花费27.571 seconds *100

在我所有的100个测试类中运行时,我只能通过一次方法来启动Spring Boot和Embedded Tomcat吗?如果这样的话,将节省时间。

1 个答案:

答案 0 :(得分:0)

在许多情况下,可能会导致spring-context重新加载并启动新服务器,例如:

  • @DirtContext:
  • @TestPropertySource
  • 不同的@ContextConfgiurations
  • @WebMvcTest / @SpringBootTest / @SpringBootConfiguration的组合
  • 不同的@ActiveProfiles

所以,让我说说我们通常在这里使用以避免这种问题的方法:

首先,我们创建一个抽象类,其中将包含测试的所有参数和配置:

@RunWith(SpringRunner.class)
@ActiveProfiles("test") 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = [<your application class OR context class>])
public abstract class AbstractSpringBootTest {
}

然后,在所有测试中,我都扩展了该测试类:

public class RefererCheckerTest extends AbstractSpringBootTest {
   ....
}

如果它们都包含相同的配置,则这将使SpringBoot在测试期间仅启动一次。

我们当前使用的是Spring-Boot 2.0.4.RELEASE,它运行良好。

注意:我们也使用SpringRunner代替SpringJUnit4ClassRunner,它从spring-test:4.3+开始可用,并且需要JUnit 4.12 +。

此外,即使spring-boot重新启动,也应该只重新加载部分上下文,而不是重新加载所有内容并花费相同的时间。另外,请检查您如何运行测试。