测试HATEOAS URL

时间:2014-03-19 05:14:23

标签: rest testing hateoas

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

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

一些示例请求:

GET /api/projects

{
  "_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

{
  "_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},将{projectId}替换为模拟服务层期望/返回的项目ID。

  2. 首先请求/api/projects/然后测试响应中返回的链接。因此,测试不会有/api/projects/{projectId}硬编码。

  3. 第一个选项使测试更加简单,但它基本上对URL进行了硬编码,这是HATEOAS首先设计避免的事情。如果因为某种原因改变URL结构,测试也需要更改。

    第二种选择在HATEOAS意义上更“正确”,但测试会更复杂;我需要遍历所有父资源来测试子资源。例如,要测试对任务的GET请求,我需要请求/api/projects/,获取/api/projects/1234的链接,请求并获取/api/projects/2345/tasks/543的链接,最后测试!如果我以这种方式测试,我还需要在每个测试中嘲笑更多。

    第二个选项的优点是我可以在不改变测试的情况下自由更改URL。

3 个答案:

答案 0 :(得分:0)

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

是的,挑战在于您决定遍历链接层次结构的深度。此外,您需要考虑非GET方法。

如果这些是自动化测试,则策略是以资源单位组织测试。仅测试在测试资源中返回的链接:项目模块,项目,任务,任务等的其他模块。这确实需要对每个模块的一些众所周知的URL进行硬编码,但允许您更轻松地围绕资源模型管理测试。

答案 1 :(得分:0)

我不知道HATEOAS。但我可以说。

您可以尝试swat - 基于perl,基于卷曲的DSL,用于网络,休息服务测试自动化。 Swat旨在简化您在这里谈论的 URL“杂耍”。关于SWAT如何实现这一目标的快速参考(一种前瞻性的方式,但有更优雅的解决方案):

$ 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!

可以在documentation找到更复杂的例子。

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

答案 2 :(得分:0)