【问题标题】:How to test REST endpoint when using callbacks using JAVA?使用 JAVA 使用回调时如何测试 REST 端点?
【发布时间】:2017-03-11 17:50:29
【问题描述】:

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

  • 第一次调用是 POST 到 /publish 的有效载荷:

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

  • 服务器回复 200 和一些 json

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

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

【问题讨论】:

  • 我需要做同样的事情。你想出解决方案了吗?
  • 不,与此同时,我开始使用 Spring Cloud Contracts 来获得更大的视野
  • 方法是正确的,synchronized object from which the test reads and validates 使用带有超时的CountDownLatch。可等待性是用于异步流断言的好框架。使用 [spark-java] 作为可以在测试中引导的测试端点。

标签: java rest karate rest-assured


【解决方案1】:

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

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

我会尽量用简单的方式解释这个图表。

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

【讨论】:

    【解决方案2】:

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

    http://wiremock.org/index.html

    https://github.com/karatelabs/karate (对于空手道,请参阅“彼得托马斯”的答案)

    它在开发过程中完美运行,但在现实世界中非常有限。测试管道通常不能从外部获得。它不能听东西。测试的开发人员在 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/

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 2020-04-21
      • 2020-12-03
      • 2018-07-23
      • 2021-05-13
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多