2014-03-19 48 views
1

我正在開發一個具有RESTful API的服務。該API基於JSON,並使用HAL作爲資源之間的HATEOAS鏈接。測試HATEOAS URL

實現不應該問題,但我使用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},與模擬服務層期望/回報項目的ID替換{projectId}

  2. 先請求/api/projects/然後測試響應中返回的鏈接。所以測試將不會有/api/projects/{projectId}硬編碼。

第一個選項,使測試更加簡單,但它基本上是在硬編碼的URL,這是事HATEOAS的目的是要避免在首位。如果我因某種原因改變了URL結構,測試也需要改變。

第二種選擇在HATEOAS意義上更「正確」,但測試會更加複雜;我需要遍歷所有的父資源來測試一個子資源。例如,要測試任務的GET請求,我需要請求/api/projects/,獲取到/api/projects/1234的鏈接,請求並獲取到/api/projects/2345/tasks/543的鏈接,最後測試一下!如果我以這種方式測試,我還需要在每個測試中嘲笑更多。

第二個選項的優點是我可以在不更改測試的情況下自由更改URL。

回答

0

如果您的目標是測試超媒體API,那麼您的測試工具需要了解如何處理和操作資源中包含的超媒體。

是的,挑戰是你決定穿越鏈接層次結構有多深。另外,您需要考慮非GET方法。

如果這些是自動化測試,則策略將是以資源單位組織測試。只測試被測資源中返回的鏈接:項目模塊,其他項目,任務,任務等。這確實需要對每個模塊的着名URL進行一些硬編碼,但允許您在資源模型周圍更容易地管理測試。

0

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

您可以嘗試swat - 基於perl,curl的DSL for web,rest services test automation。斯瓦特旨在簡化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找到。

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

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-s。

ControllerLinkBuilderUnitTest.java(https://github.com/spring-projects/spring-hateoas/blob/4e1e5ed934953aabcf5490d96d7ac43c88bc1d60/src/test/java/org/springframework/hateoas/mvc/ControllerLinkBuilderUnitTest.java)顯示瞭如何在測試中使用ControllerLinkBuilder。