使用JAVA使用回调时如何测试REST端点?

vic*_*ass 5 java rest rest-assured

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

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

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

  • 服务器回复200和一些json

  • 服务器使用http://localhost:609/test/status基于json的有效负载对POST进行异步POST (基于提供的回调URL)

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

Pet*_*mas -2

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

以下是有关如何实现此目的的示例(包含源代码链接):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。
  • 如果您的服务器是远程的,并且您无法将本地计算机“暴露”到互联网或同一网络,那么您可以轻松地在 Docker 容器中或 EC2 等云实例中的任何位置运行空手道。请注意,有诸如ngrok之类的解决方案。

空手道和 HTTP 回调