我编写了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服务器并对其运行此测试。运行此测试时,我查看日志并发现嵌入的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模拟),执行时间为11.3秒、11秒和10.8秒。在两种情况下,所有测试均通过。我的想法是,使用模拟的Web服务器可以提高测试性能,但最后只得到了1秒的收益。如果我们考虑到我的应用程序上下文在测试类之间被缓存,那么我基本上什么也没得到。所以我的问题是,在哪些情况下使用RANDOM_PORT
测试会通过而MOCK
测试失败,反之亦然?我应该何时使用RANDOM_PORT
和MOCK
?
TestRestTemplate
,这只是一个建议。为了测试真实对象的集成,例如测试客户端和服务器交互,应该使用RANDOM_PORT
。正如我所说,集成测试应尽可能与生产环境相似,使用MOCK
在这里没有意义。否则,你的系统很可能会在生产中失败。你应该在某些情况下使用MOCK
,比如测试控制器逻辑而不需要运行Web服务器。希望这能帮到你。 - HülyaRANDOM_PORT
将捕获故障,而MOCK
不会。 - Mortezaorg.springframework.boot.web.server.PortInUseException: Port 8080 is already in use
。如果你说“它不会加载真正的HTTP服务器”,那怎么可能呢?从堆栈跟踪中可以看出,它正在加载(并尝试启动)Tomcat。 - FransTestRestTemplate
。虽然这样更简单,但您也可以通过使用@LocalServerPort
或@Value("${local.server.port}")
让 Spring 从环境中注入端口。 - Nico Van Belle