本文翻译自 MockServer官网,加了一些解释,重画了所有的示意图。
1. 什么是 MockServer
对于通过HTTP或HTTPS集成的任何系统,MockServer可以用作:
-
配置为返回不同请求的特定响应的模拟
-
代理记录和选择性地修改请求和响应
-
同时是某些请求的代理和其他请求的模拟
当 MockServer 收到请求时,它会将请求与已配置的活动期望进行匹配并执行操作。如果未找到匹配项,则在适当的情况下代理请求;如果不代理请求,则返回 404。
“期望”(Expectation)是指要执行的操作(如返回响应)。
2. MockServer 支持的操作
MockServer支持六种常规操作:
1) 当请求与预期匹配时,返回“模拟”响应
2) 当请求与预期匹配时,转发请求(即“动态端口转发代理”),由转发后的服务返回响应
3) 当请求与预期匹配时,执行一个回调请求,根据回调的结果,动态创建返回的响应
4) 返回无效响应或在请求与预期匹配时关闭连接
这个和第一种操作类似,只不过是将正常请求的模拟响应,换为对错误的响应。
5) 验证请求是否已发送(即作为测试断言)
支持将常规的请求记录到持久化存储中,同时支持一个外部的请求匹配器,允许客户端向这个请求匹配器查询某个请求在持久化存储中是否存在(即已发送)。
6) 检索日志、请求或期望以帮助调试
这个和第5项验证请求是否已发送是同一个功能,只不过记录和持久化存储的是日志而已。
3. 使用 MockServer 进行代理(Proxying)
1)MockServer 作为代理的功能
-
使用以下任一代理方法代理所有请求:
- 端口转发
- Web 代理(即 HTTP 代理)
- HTTPS 隧道代理(使用 HTTP CONNECT)
- SOCKS代理(即动态端口转发)
-
验证代理请求是否已发送(即测试断言)
-
记录代理请求和响应,以分析系统的行为方式
2)MockServer 支持的代理技术
MockServer的代理功能可以将模拟响应的动作转换为实际的服务,因此扩展了MockServer的使用范围,例如对有些具有复杂的业务逻辑和行为的服务,直接模拟这些逻辑和行为可能非常困难且容易出错。通过代理请求到实际服务,可以确保这些复杂逻辑和行为被正确处理,而不需要在MockServer中重新实现这些逻辑。
MockServer支持使用各种代理技术来把请求转发给实际的服务,主要的代理技术包括:
-
端口转发
- 所有请求都转发到单个主机名或 IP 和端口;
- 实现端口转发的代理请求时,HTTP 客户端应使用 MockServer 的主机名和端口;
-
Web 代理(即 HTTP 代理)
- 对每个请求都使用其标头(header)中的“ Host” 来进行动态转发;
- 实现Web代理请求时,HTTP 客户端应配置为使用“ HTTP Proxy”;
-
安全 Web 代理(即 HTTPS 隧道代理)
- 使用设置 HTTP 隧道的 CONNECT 请求,来对请求进行转发
- SSL证书是自动生成的,允许透明地记录加密的HTTPS流量
- 实现安全Web代理请求时,HTTP 客户端应配置为使用“ HTTP Proxy”;
-
SOCKS代理(即动态端口转发)
- 使用已建立Socket隧道的 SOCK CONNECT CMD 请求,来对请求进行转发
- 如果流量是加密的,则会自动生成SSL证书,从而可以透明地记录SSL流量
- 实现SOCKS代理代理时,操作系统(或 JVM)应配置为使用 “ HTTP Proxy”
-
SSL和证书
- 所有SSL流量都通过自动生成一个适当的SSL证书,来进行透明的处理
- 生成的证书使用单个 MockServer 根 CA 证书,使根证书可以轻松导入
-
端口统一
- 为了简化配置,同一端口支持所有协议(即 HTTP、HTTPS/TLS、SOCKS 等)
- 该协议由两个 MockServer 动态检测
-
同时代理和模拟
- 将 MockServer 用作代理的同时也可以创建期望
- 收到请求后,首先将其与已配置的活动期望进行匹配,如果期望匹配,则将执行其操作,而不是代理请求
4. 为什么要使用 MockServer
MockServer 允许通过 HTTP 或 HTTPS 模拟任何服务器或服务,例如 REST 或 RPC 服务。
1)MockServer的用途
-
测试
- 轻松为 HTTP 依赖项(如 REST 或 RPC 服务)重新创建所有类型的响应,以轻松高效地测试应用程序
- 隔离被测系统,以确保测试可靠运行,并且仅在出现真正的错误时才会失败。重要的是只测试被测系统,而不是测试其依赖项,以避免由于不相关的外部更改(如网络故障或重新启动/重新部署服务器)而导致测试失败。
- 轻松为每个测试单独设置模拟响应,以确保每个测试都封装测试数据。避免在难以管理和维护的测试之间共享数据,并避免测试相互感染的风险
- 创建测试断言,以验证被测系统已发送的请求
-
解耦开发
- 在服务可用之前,开始针对服务 API 工作。如果 API 或服务尚未完全开发,MockServer 可以模拟该 API,允许任何使用该服务的团队开始工作而不会延迟
- 在初始开发阶段隔离开发团队,此时 API/服务可能非常不稳定和不稳定。使用 MockServer 允许开发工作在外部服务失败时继续进行
-
隔离单个服务
- 在部署和调试期间,在调试模式下在本地计算机上运行单个应用程序或服务或处理请求子集会很有帮助。使用 MockServer,可以很容易地有选择地将请求转发到在调试模式下运行的本地进程,所有其他请求都可以转发到实际服务,例如在 QA 或 UAT 环境中运行
2)模拟依赖项和验证请求
给定一个具有服务依赖关系的系统,如下所示:
MockServer 可用于模拟服务依赖项,如下所示:
3)隔离单个服务/应用程序
单页应用程序可以从 Web 服务器加载静态资源(如 HTML、CSS 和 JavaScript),还可以对一个或多个单独的服务进行 AJAX 调用,如下所示:
为了隔离单个 AJAX 服务,用于开发或调试,MockServer 可以有选择地将特定请求转发到服务的本地实例:
5. 为什么使用 MockServer 作为代理
MockServer 允许记录来自被测系统的请求,或者通过记录出站请求来分析现有系统。
1)MockServer代理的用途
-
测试
- 创建测试断言,以验证被测系统已发送的请求,而无需模拟任何请求
-
分析现有系统
- 记录所有出站请求,以便可以分析和支持现有系统正在发出的出站请求
-
调试 HTTP 交互
- 记录所有出站请求,以便可以可视化与外部服务的所有交互(例如,来自浏览器的交互)。这一点尤为重要,因为 Chrome 等浏览器中的网络分析工具无法准确显示所有网络交互,例如favicon.ico请求。此外,许多代理不处理加密的 HTTPS 流量,但是,MockServer 使用单个 MockServer 根 CA 证书自动生成证书,从而可以轻松导入根证书
-
录制和回放
- 所有记录的请求都可以转换为 Java 代码或 JSON 期望,以简化复杂测试场景的模拟创建
2)记录请求并分析行为
MockServer 可以记录所有代理请求,同时也可以验证代理服务的请求,如下所示: