华纳云:使用 WireMock 在开发和测试中模拟 API 服务

电子说

1.3w人已加入

描述

在本地开发和测试期间,经常会遇到您的应用依赖于远程 API 的情况。网络问题、速率限制,甚至 API 提供商的停机都可能阻碍您的进度。这会严重影响您的工作效率并使测试更具挑战性。这就是 WireMock 发挥作用的地方。

WireMock 是一个开源工具,可以帮助开发人员创建模拟真实 API 行为的模拟服务器,为开发和测试提供受控环境。

假设您有一个 API 和一个前端应用,并且想要测试前端如何与 API 交互。使用 WireMock,您可以设置一个模拟服务器来模拟 API 的响应,这样您就可以在不依赖实际 API 的情况下测试前端行为。当 API 仍在开发中或您想要在不影响实际 API 的情况下测试不同场景时,这会特别有用。WireMock 支持 HTTP 和 HTTPS 协议,可以模拟各种响应场景,包括延迟、错误和不同的 HTTP 状态代码。

在本指南中,您将学习如何:

使用 Docker 启动 WireMock 容器。
在本地开发中使用模拟数据,无需依赖外部 API
在生产中使用 Live API 从 AccuWeather 获取实时天气数据。

将 WireMock 与 Docker 结合使用

WireMock 的官方 Docker 镜像提供了一种部署和管理 WireMock 实例的便捷方式。WireMock 适用于各种 CPU 架构,包括 amd64、armv7 和 armv8,确保与不同设备和平台兼容。您可以在 WireMock 文档站点上了解有关 WireMock 独立版的更多信息。

先决条件

遵循本操作指南需要满足以下先决条件:

Docker 桌面

启动 WireMock

使用以下步骤启动 WireMock 的快速演示:

在本地克隆 GitHub 存储库。

$ git clone https://github.com/dockersamples/wiremock-node-docker


导航到wiremock-endpoint目录

$ cd wiremock-node-docker/


WireMock 充当后端与之通信以检索数据的模拟 API。已在映射目录中为您创建了模拟 API 响应。

通过在克隆的项目目录的根目录下运行以下命令来启动 Compose 堆栈

$ docker compose up -d


片刻之后,应用程序将启动并运行。

您可以通过选择容器来检查日志wiremock-node-docker:

测试 Mock API。

$ curl http://localhost:8080/api/v1/getWeather?city=Bengaluru


它将返回带有模拟数据的以下预设响应:

{"city":"Bengaluru","temperature":27.1,"conditions":"Mostly cloudy","forecasts":[{"date":"2024-09-02T07:00:00+05:30","temperature":83,"conditions":"Partly sunny w/ t-storms"},{"date":"2024-09-03T07:00:00+05:30","temperature":83,"conditions":"Thunderstorms"},{"date":"2024-09-04T07:00:00+05:30","temperature":83,"conditions":"Intermittent clouds"},{"date":"2024-09-05T07:00:00+05:30","temperature":82,"conditions":"Dreary"},{"date":"2024-09-06T07:00:00+05:30","temperature":82,"conditions":"Dreary"}]}

使用 WireMock,您可以使用映射文件定义预设响应。对于此请求,模拟数据在 JSON 文件中定义 wiremock-endpoint/mappings/getWeather/getWeatherBengaluru.json。

有关存根预制响应的更多信息,请参阅 WireMock 文档。

在开发中使用 WireMock

现在您已经尝试了 WireMock,让我们在开发和测试中使用它。在此示例中,您将使用具有 Node.js 后端的示例应用程序。此应用程序堆栈具有以下配置:

本地开发环境:Node.js 后端和 WireMock 运行的环境。
Node.js Backend:代表处理 HTTP 请求的后端应用程序。
外部 AccuWeather API:获取实时天气数据的真实 API。
WireMock:测试期间模拟 API 响应的模拟服务器。它作为 Docker 容器运行。

展示 WireMock 开发中的架构图

在开发中,Node.js 后端向 WireMock 发送请求,而不是实际的 AccuWeather API。
在生产中,它直接连接到实时 AccuWeather API 获取真实数据。

在本地开发中使用模拟数据

让我们设置一个 Node 应用程序来向 WireMock 容器而不是实际的 AccuWeather API 发送请求。

先决条件

安装 Node.js 和 npm
确保 WireMock 容器已启动并正在运行(请参阅 启动 Wiremock

按照以下步骤设置非容器化的 Node 应用程序:

导航到accuweather-api目录

确保您位于package.json文件所在的目录中。

设置环境变量。

打开目录.env下的文件accuweather-api/。删除旧条目并确保它只包含以下一行。

API_ENDPOINT_BASE=http://localhost:8080

这将告诉你的 Node.js 应用程序使用 WireMock 服务器进行 API 调用。

检查应用程序入口点

该应用程序的主文件是index.js,位于accuweather-api/src/api目录中。
此文件启动getWeather.js模块,这对您的 Node.js 应用程序至关重要。它使用dotenv包从文件中加载环境变量.env。
根据 的值API_ENDPOINT_BASE,应用程序将请求路由到 WireMock 服务器 ( http://localhost:8080) 或 AccuWeather API。在此设置中,它使用 WireMock 服务器。
代码确保ACCUWEATHER_API_KEY仅当应用程序未使用 WireMock 时才需要,从而提高效率并避免错误。

启动 Node 服务器

在启动 Node 服务器之前,请通过运行确保已经安装了 package.json 文件中列出的节点包npm install。

npm install 
npm run start


您应该看到以下输出:

> express-api-starter@1.2.0 start
> node src/index.js

API_ENDPOINT_BASE: http://localhost:8080
..
Listening: http://localhost:5001

输出表明您的 Node 应用程序已成功启动。保持此终端窗口打开。

测试模拟 API

打开一个新的终端窗口并运行以下命令来测试模拟的 API:

$ curl "http://localhost:5001/api/v1/getWeather?city=Bengaluru"


您应该看到以下输出:

{"city":"Bengaluru","temperature":27.1,"conditions":"Mostly cloudy","forecasts":[{"date":"2024-09-02T07:00:00+05:30","temperature":83,"conditions":"Partly sunny w/ t-storms"},{"date":"2024-09-03T07:00:00+05:30","temperature":83,"conditions":"Thunderstorms"},{"date":"2024-09-04T07:00:00+05:30","temperature":83,"conditions":"Intermittent clouds"},{"date":"2024-09-05T07:00:00+05:30","temperature":82,"conditions":"Dreary"},{"date":"2024-09-06T07:00:00+05:30","temperature":82,"conditions":"Dreary"}]}%

这表明你的 Node.js 应用程序现在已成功将请求路由到 WireMock 容器并接收模拟响应

您可能已经注意到,您正在尝试使用http://localhost:5001URL 而不是 port 8080。这是因为您的 Node.js 应用程序正在 port 上运行5001,并且它将请求路由到正在监听 port 的 WireMock 容器8080。

显示在 Docker Desktop 上运行的 WireMock 容器的日志的图表

显示在 Docker Desktop 上运行的 WireMock 容器的图表

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分