Я разрабатываю сервис с 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}
идентификатором проекта, который ожидает/возвращает уровень фиктивного сервиса.Сначала запрашивается
/api/projects/
, а затем проверяются ссылки, возвращаемые в ответе. Таким образом, в тесте не будет жестко закодировано/api/projects/{projectId}
.
Первый вариант делает тесты намного проще, но он в основном жестко кодирует URL-адреса, чего HATEOAS изначально хотел избежать. Тесты также должны быть изменены, если я когда-либо изменю структуру URL по той или иной причине.
Второй вариант более "правильный" в смысле HATEOAS, но тесты будут гораздо более запутанными; Мне нужно обойти все родительские ресурсы, чтобы протестировать дочерний ресурс. Например, чтобы протестировать запросы GET к задаче, мне нужно запросить /api/projects/
, получить ссылку на /api/projects/1234
, запросить это и получить ссылку на /api/projects/2345/tasks/543
и, наконец, проверить это! Мне также нужно будет больше имитировать в каждом тесте, если я буду тестировать таким образом.
Преимущество второго варианта в том, что я могу свободно менять URL-адреса, не меняя тесты.