这是一个关于在 SvelteKit+Playwright 中开发端到端测试时的设计模式/最佳实践的相当高级的问题:
确保在 e2e Playwright 测试期间对任何调用第 3 方系统的后端代码进行存根/模拟的建议方法是什么?
在我的特定情况下,我定义了
hooks.js
文件,以便在用户尝试访问受限 URL 时将用户重定向到第 3 方登录服务。我想测试 hook.js
文件作为我的 e2e 测试的一部分,但我不希望它每次都访问第 3 方服务。我想将此模式应用于测试涉及 AWS S3 后端调用的流程时遇到的类似问题。
我知道 Playwright 允许您模拟客户端执行的网络调用,但我还没有读到服务器端调用的类似功能。
有没有办法拦截由
hooks.js
和其他后端处理程序触发的传出呼叫?
PlayWright 不应该(也不可能)成为帮助您模拟后端针对第三方 API 执行的调用的首选工具。对于这种情况,您可以使用WireMock。 WireMock 是一个网络服务器,允许您为要模拟的 API 调用定义所谓的“存根”。这些模拟可以以 JSON 文件的形式定义:
{
"request": {
"method": "POST",
"urlPath": "/path/to/reply/to/with/mock/response"
},
"response": {
"status": 200,
"body": "{\"sampleResponseField\":\"valueThatWouldNormallyBeProvidedByTheThirdPartyApi\"}",
"headers": {
"Content-Type": "application/json"
}
}
}
例如,如果您的后端是 Spring Boot 应用程序,您可以有一个 e2etest 配置文件
application-e2etest.yml
,其中您的第三方 API url 与您正在运行的 WireMock 独立实例的 url 进行交换。您可以通过多种方式运行 WireMock。由于它是一个 Java 应用程序,您可以下载
其 JAR 文件并在本地或某些服务器上运行。他们还为其提供了一个official Docker Image,因此您也可以以 Docker 化的方式运行它。因此,您还可以更进一步,将其包装到 Helm Chart 中,以便能够在 Kubernetes 集群中部署和运行(已经过测试,也像 charm 一样工作)。 无论您决定以何种方式运行它,您可能都必须在
application-e2etest.yml
中调整 WireMock 实例的(基本)url(仍然假设您有一个 Spring Boot 应用程序作为后端)。如果您的后端基于不同的框架,您很可能会采用类似的方式来运行具有不同配置的应用程序。
为了快速了解它,我建议您以 Docker 化的方式在本地运行 WireMock,并将您事先准备好的示例模拟挂载到其中:docker run -d --rm -p 8080:8080 --name wiremock -v ~/host/path/to/my/wiremock/stubs:/home/wiremock wiremock/wiremock:2.35.0
# And subsequently run a curl on it in order to check whether it responds as expected
curl http://localhost:8080/path/to/reply/to/with/mock/response
现在,WireMock 服务器应该回复您之前在存根中定义的所需响应。不要忘记将存根放入名为
mappings
的目录中,因为
WireMock 期望存根位于具有该名称的目录中。 我希望这能让你继续前进。