webEnvironment = RANDOM_PORT 和 webEnvironment = MOCK 的区别

Spa*_*vić 10 java testing spring-boot-test

我写了 spring boot 集成测试,它正在工作。这是测试配置:

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

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

}
Run Code Online (Sandbox Code Playgroud)

我知道在设置webEnvironment = RANDOM_PORTspring 时将初始化嵌入式 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
Run Code Online (Sandbox Code Playgroud)

...更多的日志,然后最后

  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 ''
Run Code Online (Sandbox Code Playgroud)

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

Hül*_*lya 6

使用@SpringBootTest(webEnvironment = WebEnvironment.MOCK)加载 Web 应用程序上下文并提供模拟 Web 环境。它不会加载真正的 http 服务器,只是模拟整个 Web 服务器的行为。

WebEnvironment.MOCK 为您提供了一些优势,例如易于使用或隔离其他因素,但它可能不是一个好的集成测试实践。

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

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

TestRestTemplate 是 Spring 的 RestTemplate 的便捷替代品,在集成测试中很有用。...如果您将@SpringBootTest 注释与WebEnvironment.RANDOM_PORT 或WebEnvironment.DEFINED_PORT 一起使用,您可以注入一个完全配置的TestRestTemplate... https://docs.spring.io/spring-boot/docs/current/reference/html /boot-features-testing.html#boot-features-rest-templates-test-utility