我正在开发一个具有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请求?我有两个选择,我不确定哪个更好:
在测试中测试/api/projects/{projectId}
,将{projectId}
替换为模拟服务层期望/返回的项目ID。
首先请求/api/projects/
然后测试响应中返回的链接。因此,测试不会有/api/projects/{projectId}
硬编码。
第一个选项使测试更加简单,但它基本上对URL进行了硬编码,这是HATEOAS首先设计避免的事情。如果因为某种原因改变URL结构,测试也需要更改。
第二种选择在HATEOAS意义上更“正确”,但测试会更复杂;我需要遍历所有父资源来测试子资源。例如,要测试对任务的GET请求,我需要请求/api/projects/
,获取/api/projects/1234
的链接,请求并获取/api/projects/2345/tasks/543
的链接,最后测试!如果我以这种方式测试,我还需要在每个测试中嘲笑更多。
第二个选项的优点是我可以在不改变测试的情况下自由更改URL。
答案 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)
如果使用Spring HATEOAS,您可以使用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。
ControllerLinkBuilderUnitTest.java(https://github.com/spring-projects/spring-hateoas/blob/4e1e5ed934953aabcf5490d96d7ac43c88bc1d60/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java)展示了如何在测试中使用ControllerLinkBuilder。