菜单

测试

相关源文件

本文档涵盖了 Spring Framework 对 Web 应用程序全面的测试支持。它侧重于两种主要的测试方法:面向传统 Web 应用程序的 Servlet API 的模拟实现,以及面向 WebFlux 应用程序的响应式 Web 测试工具。

有关测试中的通用 Spring 测试概念,例如依赖注入,请参阅核心组件。有关构建系统和测试配置,请参阅构建与开发

概述

Spring 的测试支持提供了一套完整的工具,用于测试 Web 应用程序,而无需运行服务器。该框架同时为传统的 Spring MVC 应用程序提供了基于 Servlet 的模拟,也为 WebFlux 应用程序提供了响应式测试功能。

来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java1-550 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java1-100 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java1-100

架构组件

测试框架由几个关键的架构层组成,它们协同工作以提供全面的 Web 测试功能

来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java70-130 spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java50-110 spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java50-100

Servlet API 模拟

Spring 提供了完整的 Servlet API 模拟实现,使您无需 Servlet 容器即可测试 Web 组件。这些模拟主要位于 org.springframework.mock.web 包中。

核心 Mock 类

Servlet 模拟框架围绕三个主要类展开

目的主要功能
MockHttpServletRequestMock HTTP 请求参数、头信息、Cookie、内容
MockHttpServletResponseMock HTTP 响应状态、头信息、内容捕获
MockCookie增强的 Cookie 实现SameSite、Partitioned 属性

MockHttpServletRequest

MockHttpServletRequest 类提供了全面的模拟实现,支持所有标准的 Servlet 请求功能

关键配置方法包括 setMethod()setRequestURI()setContent()addParameter()addHeader()。该类通过 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java508-569 支持参数和基于内容的请求正文处理

来源: spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java95-320 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletRequest.java508-625

MockHttpServletResponse

MockHttpServletResponse 捕获响应数据并提供断言方法

spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java350-376 所示,响应模拟会自动处理字符编码、内容类型解析和 Cookie 管理。

来源: spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java68-130 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java279-320

MockCookie

MockCookie 扩展了标准的 Cookie 类,支持现代 Cookie 属性

  • 通过 setSameSite()getSameSite() 支持 SameSite 属性
  • 通过 setPartitioned()isPartitioned() 支持 Partitioned 属性
  • Expires 属性支持 ZonedDateTime
  • 用于解析 Set-Cookie 头信息的工厂方法 parse()

解析实现处理复杂的 Cookie 语法,如 spring-test/src/main/java/org/springframework/mock/web/MockCookie.java134-183 所示。

来源: spring-test/src/main/java/org/springframework/mock/web/MockCookie.java41-130 spring-test/src/main/java/org/springframework/mock/web/MockCookie.java134-196

响应式 Web 测试

Spring 的响应式 Web 测试以 WebTestClient 为中心,它提供了一个用于测试 WebFlux 应用程序的流畅 API。该客户端可以在模拟模式下(无服务器)运行,或连接到正在运行的服务器。

WebTestClient 架构

来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java175-254 spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java822-926

请求规范

流畅的 API 指导用户完成请求构建

  1. URI 规范:通过 UriSpec,使用 uri(String, Object...)uri(URI) 等方法
  2. 头信息配置:通过 RequestHeadersSpec,使用 header()accept()cookie() 方法
  3. 正文内容:使用 RequestBodySpec,使用 bodyValue()body() 和内容类型方法

请求构建过程在 spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java188-424 中实现

来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java554-817 spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java188-300

响应断言

WebTestClient 通过 ResponseSpec 接口提供了全面的断言能力

来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/StatusAssertions.java35-80 spring-test/src/main/java/org/springframework/test/web/reactive/server/HeaderAssertions.java48-200 spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java822-1000

ExchangeResult 系统

该结果系统捕获完整的请求/响应信息

通过 ExchangeResult 中实现的 assertWithDiagnostics() 方法,ExchangeResult 提供诊断信息和断言支持

来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java214-225 spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java58-130 spring-test/src/main/java/org/springframework/test/web/reactive/server/ExchangeResult.java130-280

WiretapConnector

WiretapConnector 拦截并捕获实际的 HTTP 流量以进行测试

  • 装饰另一个 ClientHttpConnector 以捕获请求/响应数据
  • 通过 WebTestClient.WEBTESTCLIENT_REQUEST_ID 头按键存储交换信息
  • 创建包含完整事务详细信息的 ExchangeResult 实例
  • 处理常规和模拟服务器场景

窃听机制通过请求和响应装饰器实现,如 spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java64-86所示

来源: spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java52-100 spring-test/src/main/java/org/springframework/test/web/reactive/server/WiretapConnector.java88-100