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

2022-07-19 00:00:00 rest java karate rest-assured

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

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

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

  • 服务器回复200和一些json

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

我使用TestNG和REST-Assured(非强制)构建了一个测试。我的问题是如何验证在回调URL上接收到的初始回复和消息。 我首先想到的一种(可能很天真的)方法是实现一个HTTP服务器,它在http://localhost:609/test/status侦听,当有东西到来时,它会写入测试从中读取和验证的同步对象。然而,听起来有点棘手(测试本地服务器将使用内部类,等等)。也很脆弱。有没有人能想到更好的办法?


解决方案

使用Karate。免责声明:我是开发商。

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

我会试着用简单的方式来解释这个图表。

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

相关文章