我写了Spring Boot集成测试,它正在运行。这是测试配置:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureMockMvc
@Transactional
public class SomeTest {
   @Autowired
   private MockMvc mvc;

   @Test
   public void insertEventTest(){
      ...testing something...
   }

}

我了解在设置webEnvironment = RANDOM_PORT时,spring将初始化嵌入式Web服务器并对该Web服务器运行此测试。我在运行此测试时查看了日志,并看到嵌入式TomcatWebServer已启动。初始化Tomcat大约需要6秒钟,但是在日志的这两部分之间没有初始化其他的bean,因此我很确定初始化Tomcat并不是6秒钟,而是少于6秒钟。
日志的一部分:
2019-10-13 16:03:20.065  INFO 8596 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 0 (http)
2019-10-13 16:03:20.098  INFO 8596 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-10-13 16:03:20.098  INFO 8596 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-10-13 16:03:20.108  INFO 8596 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
2019-10-13 16:03:20.228  INFO 8596 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext

...一些更多的日志,然后终于
  2019-10-13 16:03:26.366  INFO 8596 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 38335 (http) with context path ''

我运行了3次测试,完成测试需要12、11.4和12秒。之后,我尝试设置@SpringBootTest(webEnvironment = MOCK)。我注意到这一次Tomcat尚未初始化(Web服务器被spring mock 了)。执行时间为11.3、11和10.8秒。在这两种情况下,所有测试均为绿色。我的想法是,我将使用模拟的Web服务器提高测试性能,但得到的结果是1秒。如果我们牢记我的应用程序上下文在测试类之间进行了缓存,那么我基本上一无所获。所以我的问题是,在哪种情况下,测试将通过@SpringBootTest(webEnvironment = RANDOM_PORT)通过,而通过@SpringBootTest(webEnvironment = MOCK)失败,反之亦然;何时应该使用RANDOM_PORT?何时使用MOCK

最佳答案

使用@SpringBootTest(webEnvironment = WebEnvironment.MOCK)加载Web应用程序上下文并提供模拟Web环境。它不会加载真正的http服务器,只是模拟了整个网络服务器的行为。
WebEnvironment.MOCK具有一些优点,例如易于使用或隔离其他因素,但它可能不是一个好的集成测试实践。

集成测试应与生产环境尽可能相似。考虑到这一点,使用@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)将是一个更好的选择。这种方法更接近于测试实际应用程序。您可以查看整个系统是否将按预期工作。

当您使用@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)时,您将使用真实的http服务器进行测试。在这种情况下,您需要使用TestRestTemplate。当您要测试与Web层相关的某些周围行为时,这很有用。

10-05 18:22