【问题标题】:Why are there different types of integration tests in Spring Boot为什么 Spring Boot 中有不同类型的集成测试
【发布时间】:2018-03-25 17:38:20
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    • 测试范围; MockMVC 测试用例通常比完整的集成测试更快、更容易启动(因为它们使用的应用程序上下文更少)。此外,由于它们较少使用您的应用上下文,您可能不必费力地模拟您的真实应用上下文中在测试中表现不佳的任何方面。

    • 易于使用; MockMVC 带有静态助手,用于断言 HTTP 状态、询问和断言 JSON 响应等。当然是 YMMMV,但对于许多人来说,这些有助于简化开发并帮助交付可读的测试用例。

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

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

    【讨论】:

    • 感谢您的详细解释!我唯一不能确认的是 MockMVC 测试更快。它需要完全相同的时间(在我的机器上)
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2020-04-24
    • 2017-10-27
    • 1970-01-01
    • 2018-03-22
    相关资源
    最近更新 更多