首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试HATEOAS

测试HATEOAS
EN

Stack Overflow用户
提问于 2014-03-19 05:14:23
回答 3查看 2.8K关注 0票数 2

我正在开发一个具有RESTful API的服务。该API基于JSON,并使用硬件实现资源之间的HATEOAS链接。

实现与问题无关,但我使用的是Java和Spring。

一些例子要求:

GET /api/projects

代码语言:javascript
复制
{
  "_links" : {
    "self" : {
      "href" : "example.org/api/projects"
    },
    "projects" : [ {
      "href" : "example.org/api/projects/1234",
      "title" : "The Project Name"
    }, {
      "href" : "example.org/api/projects/1235",
      "title" : "The Second Project"
    } ]
  },
  "totalProjects" : 2,
}

GET /api/projects/1234

代码语言:javascript
复制
{
  "_links" : {
    "self" : {
      "href" : "example.org/api/projects/1234"
    },
    "tasks" : [ {
      "href" : "example.org/api/projects/1234/tasks/543",
      "title" : "First Task"
    }, {
      "href" : "example.org/api/projects/1234/tasks/544",
      "title" : "Second Task"
    } ]
  },
  "id" : 1234,
  "name" : "The Project Name",
  "progress" : 60,
  "status" : "ontime",
  "targetDate" : "2014-06-01",
}

现在,我应该如何测试对单个项目的GET请求?我有两个选择,我不知道哪一个更好:

  1. 在测试中测试/api/projects/{projectId},用模拟服务层期望/返回的项目id替换{projectId}
  2. 请求/api/projects/,然后测试响应中返回的链接。因此,测试将不使用/api/projects/{projectId}硬编码。

第一个选项使测试变得更简单,但它基本上是硬编码URL,这是HATEOAS最初设计要避免的事情。如果我出于某种原因更改URL结构,那么测试也需要更改。

第二个选项在HATEOAS意义上更“正确”,但测试将更加复杂;我需要遍历所有父资源来测试子资源。例如,要测试对任务的GET请求,我需要请求/api/projects/,获取到/api/projects/1234的链接,请求它,获得到/api/projects/2345/tasks/543的链接,最后测试它!如果我这样测试的话,我还需要在每次测试中模拟更多。

第二个选项的优点是我可以自由地更改URL,而无需更改测试。

EN

回答 3

Stack Overflow用户

发布于 2014-03-24 12:41:39

如果您的目标是测试超媒体API,那么您的测试工具需要了解如何处理和处理包含在资源中的超媒体。

是的,挑战在于你决定穿越链接层次的深度。此外,您还需要考虑非获取方法。

如果这些是自动化测试,那么策略就是在资源单元中组织测试。只测试在所测试的资源中返回的链接:一个用于项目的模块,以及用于项目、任务、任务等的其他模块。这确实需要对每个模块的著名URL进行一些硬编码,但是可以让您更容易地围绕资源模型管理测试。

票数 0
EN

Stack Overflow用户

发布于 2016-01-27 09:02:42

我不知道是怎么回事。但我能说的是。

您可以尝试一个 -一个基于perl、基于卷曲的DSL,用于web、rest服务测试自动化。Swat的目的是简化URL“杂耍”,您可能在这里谈论。关于SWAT如何做到这一点的快速参考(一种海峡前进的方式,但有更优雅的解决方案):

代码语言:javascript
复制
$ mkdir -p api/project/project_id
$ echo '200 OK' > api/project/project_id/get.txt

$ nano  api/project/project_id/hook.pm

   modify_resource(sub{
     my $r = shift; # this is original rout api/project/project_id/
     my $pid = $ENV{project_id};
     $r=~s{/project_id}{$pid} # dynamically setup route to api/project/{project_id}
     return $r;
   }); 

$ project_id=12345 swat  http://your-rest-api # run swat test suite!

一个更复杂的例子可以在文档上找到。

(*)披露--我是工具作者。

票数 0
EN

Stack Overflow用户

发布于 2016-02-02 14:12:31

如果您使用Spring,您可以使用ControllerLinkBuilder (http://docs.spring.io/autorepo/docs/spring-hateoas/0.19.0.RELEASE/api/org/springframework/hateoas/mvc/ControllerLinkBuilder.html)在您的测试中创建链接,如http://docs.spring.io/spring-hateoas/docs/0.19.0.RELEASE/reference/html/#fundamentals.obtaining-links中所述。对于ControllerLinkBuilder,没有硬编码的URL-s。

ControllerLinkBuilderUnitTest.java (https://github.com/spring-projects/spring-hateoas/blob/4e1e5ed934953aabcf5490d96d7ac43c88bc1d60/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java)演示了如何在测试中使用ControllerLinkBuilder。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22496830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档