为什么在Spring Boot中有不同类型的集成测试

时间:2017-10-13 14:36:03

标签: spring testing spring-boot resttemplate spring-test

有人知道为什么Spring Boot Guide包含两种不同类型的集成测试吗? (https://github.com/spring-guides/gs-spring-boot#add-unit-tests

一个有TestRestTemplate,一个有MockMvc依赖?在每个测试类型中,spring boot引导测试环境。那么这种分离的原因是什么?

1 个答案:

答案 0 :(得分:3)

当您使用MockMvc时,您正在测试应用程序的实例,其中已经模拟了HTTP请求周期。因此,这里的测试范围只是应用程序的MVC方面。我认为这通常不会被标记为“集成测试”,而是更接近单元测试(尽管其范围远大于单个类)。

当您使用TestRestTemplate时,您正在测试应用程序的真实实例,即您正在“弹出”整个应用程序上下文并将其作为外部actor调用。这通常被称为“集成测试”,它可能是对您实际使用情况的最接近的测试。

现在,由于通过TestRestTemplate调用的“完整堆栈”集成测试可以提供MockMVC测试提供的覆盖范围的超集,您可能想知道为什么要打扰MockMVC测试。如果是这样,那么我认为这是一个......的问题。

  • 测试范围;与完全集成测试相比,MockMVC测试用例通常更快更容易启动(因为它们使用的应用程序上下文更少)。此外,由于他们使用较少的appolication上下文,因此您可能不必非常难以模拟真实应用程序上下文的任何方面,这些方面在测试中效果不佳。

  • 易于使用; MockMVC附带了静态帮助程序,用于断言HTTP状态,查询和断言JSON响应等。当然YMMMV,但对于许多人来说,这些便于开发并帮助提供可读的测试用例。

在实践中,您可能希望结合使用这两种方法:

  • MockMVC测试整个控制器层的详细测试,包括所有调用的所有映射,快乐和悲伤路径以及HTTP状态代码,内容主体等的深层断言
  • TestRestTemplate测试从用户角度表示的主要流程,例如Save a new FooSearch for all FoosSubmit an invalid Foo update等,其中的断言主要关注用户看到/感兴趣的位。