11

我想针对使用回调参数的 REST 端点编写一些测试。可能听起来令人困惑,所以这里有一个解释:

  • 第一个调用是/publish带有有效负载的 POST:

    {"callbackURL":"http://localhost:609/test"}

  • 服务器回复 200 和一些 json

  • 服务器执行异步 POST http://localhost:609/test/status(基于提供的回调 URL),带有一些 json 有效负载

我使用 TestNG 和 Rest-assured(非强制性)构建了一个测试。我的问题是如何验证初始回复和在回调 URL 处收到的消息。我首先想到的一种(可能是幼稚的)方法是实现一个 HTTP 服务器,它监听http://localhost:609/test/status,当有东西出现时,它写入一个同步对象,测试从中读取和验证。但是,听起来有点棘手(测试本地服务器将使用内部类等)并且很脆弱。谁能想到更好的方法?

4

2 回答 2

-1

使用空手道。免责声明:我是开发人员。

这是一个关于如何实现此目的的示例(带有指向源代码的链接):https ://twitter.com/KarateDSL/status/1417023536082812935

我将尝试以简单的方式解释该图。

  • Test测试开始时创建一个模拟 HTTP 服务器。这里端口是动态的,但如果客户端是远程的,您可以很好地将其硬编码为例如 8080。所以客户可以打电话http://hostname/8080/send
  • 请注意模拟如何能够与 Java 类“对话”。以及如何Test等待 Java 类发出状态更改的信号 - 当某些东西调用Mock.
  • 这个特定的演示使用消息队列来连接MockJava 类。但是你不需要走那么远来响应一个回调,只需CompletableFuture通过调用一些方法而不是你QueueUtils.send()在示例中看到的地方来完成
  • 这里Test本身正在调用,Mock但在你描述的场景中,你可以很好地调用/publish然后等待回调。
  • 如果服务器是远程的并且不能完全由您控制,您将需要以某种方式告诉它要回调的 URL。但是在这里的问题中,您似乎可以在/publish调用本身中传递 URL。
  • 如果您的服务器是远程服务器,并且您无法将本地计算机“暴露”到 Internet 或同一网络,您可以轻松地在任何包装在 Docker 容器中或在 EC2 等云实例中运行空手道。请注意,有一些解决方案,例如ngrok

空手道和 HTTP 回调

于 2021-10-01T13:06:26.203 回答
-1

从测试代码中启动本地 HTTP 服务器是一种简单的方法。有很多库可以做到这一点,例如 WireMock:

http://wiremock.org/index.html

https://github.com/karatelabs/karate (对于空手道,请参阅“Peter Thomas”的答案)

它在开发过程中完美运行,但在现实世界中非常有限。测试管道通常不能从外部获得。它不能听东西。测试的开发人员在 NAT/防火墙后面的本地网络中工作。他将无法侦听来自登台或生产环境(在 DMZ 或云中运行)的请求。

更好的解决方案是使用模拟服务器。它必须侦听请求并记录此事件。测试在下一步中向模拟服务器询问事件并对其进行验证。

可以使用基于云的模拟服务器,例如 Postman 或 MockLab:

https://www.mocklab.io/docs/stubbing/

https://learning.postman.com/docs/designing-and-developing-your-api/mocking-data/setting-up-mock/

对于简单的用例,可以使用任何公共云提供商(如 AWS)手动开发模拟服务器。测试必须部署一个小型 Lambda 函数,该函数侦听请求并将其放在 S3 存储上进行验证。AWS 很可能不会为此用例向您收费。每月 100 万个请求是免费的:

https://aws.amazon.com/lambda/pricing/

或者可以将此逻辑实现为正在测试的服务器的一部分。

于 2021-10-05T10:52:57.230 回答