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

时间:2016-07-14 18:59:01

标签: java web-services rest

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

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

7 个答案:

答案 0 :(得分:3)

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

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

<强> 2。此外,如果您正在编写调用第三方REST服务的其他客户端。测试REST客户端的最佳方法是什么?您是否拥有与第三方REST服务通信的JUnit测试。您可能会遇到服务无法使用的风险/或者生产REST服务无法在没有特定凭据的情况下访问。

  • 您通常可以根据您使用的语言使用任何类型的Http客户端库。通过测试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通常是一个很好的起点。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我建议您查看REST Assured以自动测试REST服务。以下示例是从web page复制的:

  

例如,如果您的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));

}

有关详细信息,请参阅getting startedusage指南。

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

答案 4 :(得分:0)

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

客户端库

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

项目配置

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

模拟端点

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

模拟数据

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

<强>嘲讽

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

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

答案 5 :(得分:0)

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

与REST保证here进行了详细比较。它也被列为one of the top 5开源API测试工具,仅在发布后的6个月内。

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

答案 6 :(得分:-1)

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

与REST保证here进行了详细比较。它也被列为one of the top 5开源API测试工具,仅在发布后的6个月内。

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