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

3

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

一种使用TestRestTemplate,另一种使用MockMvc依赖项?在每种测试类型中,Spring Boot都会引导测试环境。那么这种分离的原因是什么呢?

1个回答

6
当您使用MockMvc时,您正在测试一个已被模拟HTTP请求周期的应用程序实例。因此,在这里,测试范围仅限于应用程序的MVC方面。我认为这通常不会被标记为“集成测试”,而更接近于单元测试(尽管它的范围要大得多)。
当您使用TestRestTemplate时,您正在测试您的应用程序的一个真实实例,即您正在“启动”整个应用程序上下文并将其作为外部参与者调用。这通常称为“集成测试”,并且很可能是最接近实际使用的测试。
现在,由于通过TestRestTemplate调用的“全堆栈”集成测试可以提供比MockMVC测试提供的覆盖范围更大的超集,您可能想知道为什么还会费心进行MockMVC测试。如果是这样,那么我认为这个问题是......
  • 测试范围; MockMVC 测试用例通常比完整的集成测试快速且易于启动(因为它们使用较少的应用程序上下文)。此外,由于它们使用较少的应用程序上下文,您可能不必费力地模拟您的真实应用程序上下文中不适合测试的任何方面。

  • 易用性; MockMVC 带有静态助手,可用于断言HTTP状态、查询和断言JSON响应等。当然,您的经验可能因人而异,但对于许多人来说,这些设施便利开发,并有助于提供可读性测试用例。

实际上,您可能希望结合两种方法使用:
  • MockMVC测试用于详细测试整个控制器层,包括所有映射、所有调用的happy和sad路径以及关于HTTP状态码、内容主体等的深度断言。
  • TestRestTemplate测试用于从用户的角度表达的主要流程,例如保存新Foo搜索所有Foos提交无效的Foo更新等,其断言集中在您的用户看到/感兴趣的部分。

感谢您的详细解释!唯一无法确认的是MockMVC测试是否更快。在我的机器上,它需要完全相同的时间。 - DimarZio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接