繁体   English   中英

在java中测试REST服务的最佳方法

[英]Best way to test a REST service in java

  1. 在Java中测试REST服务的最佳方法是什么? 开发人员通常采用哪些方法和工具集?

  2. 此外,如果您正在编写调用第三方REST服务的其他客户端。 测试REST客户端的最佳方法是什么? 您是否拥有与第三方REST服务通信的JUnit测试。 您可能会遇到服务无法使用的风险/或生产REST服务无法访问而无需某些凭据。

1.在Java中测试REST服务的最佳方法是什么? 开发人员通常采用哪些方法和工具集?

  • 您可以通过首先测试服务本身的实际代码和功能来测试您的休息服务,并使用适用于您的项目的任何单元测试库确保它正常运行。 接下来,您将发布REST服务并尝试使用某种类型的http客户端访问RESTful方法。
    通常,最简单的方法只是一个普通的旧浏览器。 如果是基于GET或PUT的请求,请输入网址和信息。 如果是帖子,您可以使用浏览器插件或开发工具来帮助根据需要将数据添加到请求或标头的正文中,并验证您是否获得了预期的响应。 如果它在浏览器中工作,它应该与您选择的任何支持HTTP的客户端执行类似的操作。

2.此外,如果您正在编写调用第三方REST服务的其他客户端。 测试REST客户端的最佳方法是什么? 您是否拥有与第三方REST服务通信的JUnit测试。 您可能会遇到服务无法使用的风险/或生产REST服务无法访问而无需某些凭据。

  • 您通常可以根据您使用的语言使用任何类型的Http Client库。 通过测试REST客户端来注意的主要缺陷是确保捕获REST服务返回的响应并检查状态。 如果它是好的,你将获得200,服务器错误500等。等。
    我建议您查看W3C或Wikipedia状态代码信息https://en.wikipedia.org/wiki/List_of_HTTP_status_codeshttps://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
    此外,您应该了解可以从特定服务返回的响应类型。 这应该在服务的api文档中提供。 api还应解释需要通过标头或作为REST调用的参数传递的任何类型的凭证或要求。

了解REST如何工作以及HTTP通常是一个很好的起点。

有几种方法可以测试REST API,具体取决于您的需求:

  • Jersey Test - 您可以使用内存中的HTTP服务器执行和测试REST API调用。 您需要模拟您的代码 - 使用MockitoJersey 1.19测试配置 - 模拟类 )或内存测试数据库。
  • Rest Assured - 主要缺点是您需要单独/单独地从测试运行REST API项目( RestAssured测试而不运行Tomcat
  • 带UI的工具 - SOAP UI邮递员
  • Swagger - 生成交互式文档 - 您可以根据代码中的注释方法使用准备好的数据执行REST方法的Web页面。
  • 使用Spring Boot开发REST服务。 它有各种测试工具,您可以在没有过多配置的情况下开箱即用。

您可以使用SoapUI创建REST服务模拟。 此外,如果您需要通过maven运行此测试,您可以使用soapui-maven-plugin自动执行soapui服务

我建议您查看REST Assured以自动测试REST服务。 以下示例从其网页复制:

例如,如果您的HTTP服务器在“ http:// localhost:8080 / lotto / {id}”处返回以下JSON:

{
   "lotto":{
      "lottoId":5,
      "winning-numbers":[2,45,34,23,7,5,3],
      "winners":[
         {
            "winnerId":23,
            "numbers":[2,45,34,23,3,5]
         },
         {
            "winnerId":54,
            "numbers":[52,3,12,11,18,22]
         }
      ]
   }
}

您可以轻松使用REST Assured从响应中验证有趣的事物:

@Test public void
lotto_resource_returns_200_with_expected_id_and_winners() {

    when().
            get("/lotto/{id}", 5).
    then().
            statusCode(200).
            body("lotto.lottoId", equalTo(5), 
                 "lotto.winners.winnerId", containsOnly(23, 54));

}

有关详细信息,请参阅入门使用指南。


如果您使用Spring Boot实现了服务器应用程序,那么您可能还会发现几年前我写的有关集成测试Spring Boot应用程序的博客文章。 它显示了Spring Boot测试支持如何启动嵌入式Web服务器并在针对REST API执行基于REST Assured的测试之前将应用程序部署到该服务器。 换句话说,您既不必手动启动Web服务器,也不需要在测试之间重新部署应用程序。 事实上,您甚至不必在代码更改之间创建.war或.jar文件,以验证REST API更改。

对于问题的第2部分,正确的答案取决于各种因素。 您可能需要考虑模拟的分辨率以及编写和维护测试所花费的时间。

客户端库

HTTP客户端的选择会影响您的选择 - 一些klients(如Spring RestTemplate)提供内置的模拟支持。 如果您有像swagger或RAML文件这样的服务定义,那么您需要生成客户端。

项目配置

最彻底的方法是实际让应用程序对真实端点进行HTTP调用,涉及完整堆栈。 如果是这样,请配置项目,以便以每个环境(或配置文件)方式注入客户端URL。

模拟端点

你想要每单元测试模拟。 没有'可部署的模拟'可以进行多个单元测试。 服务在localhost端口上进行模拟 - 最好是随机选择,以便可以进行并行测试(即在jenkins上)。

模拟数据

为了节省时间,对于深度数据结构,非常希望从文件中读取模拟数据,而不是以编程方式构造。 文件更容易使用,特别是如果您启用请求/响应日志记录,修复错误等等更快。

惩戒

一些框架与服务松散耦合,因为它们严格不了解服务的性质。 通常,您会在单元测试中编码的某个路径上模拟响应。 这就像Wiremock和我见过的大多数测试框架。

虽然其他工具直接在类服务定义上工作,但基本上你可以使用像Mockito这样的工具来直接模拟对象(但是包装在真正的端点中)。 这应该不易出错,但需要存在类(作为测试依赖性)。 为了比较,我写了一个这样的工具

Karate是一个从头开始设计用于测试Web服务API的框架。 它在Stack Overflow上有自己的标记

有一个与保证的REST了详细的对比在这里 它也被列为五大开源API测试工具之一,仅在发布后的6个月内。

免责声明:我恰好是空手道的作者。

Karate是一个从头开始设计用于测试Web服务API的框架。 它在Stack Overflow上有自己的标记

有一个与保证的REST了详细的对比在这里 它也被列为五大开源API测试工具之一,仅在发布后的6个月内。

免责声明:我恰好是空手道的作者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM