web环境 = RANDOM_PORT 和 web 环境 = MOCK 之间的差异

2022-09-03 15:10:56

我写了弹簧靴集成测试,它正在工作。下面是测试配置:

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

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

}

我知道在设置spring时会初始化嵌入式Web服务器,并对该Web服务器运行此测试。我在运行此测试时查看了日志,并看到嵌入式已启动。初始化Tomcat大约需要6秒钟,但在日志的这两个部分之间,几乎没有其他豆子被初始化,所以我非常确定初始化Tomcat不是6秒,而是不到6秒。日志的一部分:webEnvironment = RANDOM_PORTTomcatWebServer

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秒。之后,我试图设置.我注意到这次没有初始化(Web服务器被春天嘲笑了)。执行时间为 11.3 秒、11 秒和 10.8 秒。在这两种情况下,所有测试都是绿色的。我的想法是,我将使用模拟Web服务器提高测试的性能,但我得到的是1秒。如果我们考虑到我的应用程序上下文是在测试类之间缓存的,那么我基本上什么也没得到。所以我的问题是,在哪些情况下,测试将通过,反之亦然,我应该何时使用,何时使用?@SpringBootTest(webEnvironment = MOCK)Tomcat@SpringBootTest(webEnvironment = RANDOM_PORT)@SpringBootTest(webEnvironment = MOCK)RANDOM_PORTMOCK


答案 1

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

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

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

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

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


答案 2

在某些情况下,无法捕获故障,而 ,因为它启动了真正的Web服务器。MOCKRANDOM_PORT

示例在文档中

例如,Spring Boot 的错误处理基于 Servlet 容器提供的“错误页”支持。这意味着,虽然您可以测试 MVC 层引发并按预期处理异常,但不能直接测试是否呈现了特定的自定义错误页。如果需要测试这些较低级别的关注点,可以启动完全运行的服务器,如下一节所述。