Статьи

Тестирование клиентской части сервисов RESTful

Разработка приложения, использующего веб-API RESTful, может подразумевать разработку на стороне сервера и клиента. Написание интеграционных тестов для серверной части может быть таким же простым, как использование Arquillian для запуска сервера и REST-гарантия, чтобы проверить, что сервисы работают должным образом. Проблема в том, как проверить клиентскую сторону. В этом посте мы увидим, как протестировать клиентскую часть, кроме использования макетов.

В качестве краткого описания, для тестирования клиентской части нам нужен локальный сервер, который может возвращать записанные ответы JSON . Rest-client-driver — это библиотека, которая имитирует службу RESTful . Вы можете установить ожидания для HTTP- запросов, которые вы хотите получить во время теста. Так что это именно то, что нам нужно для нашей стороны Java-клиента. Обратите внимание, что этот проект действительно полезен для написания тестов при разработке веб-клиентов RESTful для подключения к сервисам, разработанным сторонними разработчиками, такими как Flickr Rest API , Jira Rest API , Github
Первое, что нужно сделать, это добавить зависимость rest-client-driver :

1
2
3
4
5
6
<dependency>
    <groupId>com.github.rest-driver<groupId>
    <artifactId>rest-client-driver<artifactId>
    <version>1.1.27<version>
    <scope>test<scope>
<dependency>

Следующим шагом мы собираемся создать очень простое приложение на Джерси, которое просто вызывает метод get для требуемого URI.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class GithubClient {
 
 private static final int HTTP_STATUS_CODE_OK = 200;
 
 private String githubBaseUri;
 
 public GithubClient(String githubBaseUri) {
  this.githubBaseUri = githubBaseUri;
 }
 
 public String invokeGetMethod(String resourceName) {
 
  Client client = Client.create();
  WebResource webResource = client.resource(githubBaseUri+resourceName);
  ClientResponse response = webResource.type('applicationjson')
    .accept('applicationjson').get(ClientResponse.class);
  int statusCode = response.getStatus();
 
  if(statusCode != HTTP_STATUS_CODE_OK) {
   throw new IllegalStateException('Error code '+statusCode);
  }
 
  return response.getEntity(String.class);
 }
 
}

И теперь мы хотим проверить, что invokeGetMethod действительно получает требуемый ресурс. Предположим, что этот метод в рабочем коде будет отвечать за получение имени всех проблем из проекта, зарегистрированного на github .

Теперь мы можем начать писать тест:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
@Rule
public ClientDriverRule driver = new ClientDriverRule();
 
@Test
public void issues_from_project_should_be_retrieved() {
 
 driver.addExpectation(
   onRequestTo('reposlordofthejarsnosqlunitissues').
     withMethod(Method.GET), giveResponse(GET_RESPONSE));
 
 GithubClient githubClient = new GithubClient(driver.getBaseUrl());
 
 String issues = githubClient.invokeGetMethod('reposlordofthejarsnosqlunitissues');
 assertThat(issues, is(GET_RESPONSE));
 
}
  • Мы используем аннотацию ClientDriverRule @Rule для добавления клиента-драйвера в тест.
  • И затем, используя методы, предоставленные классом RestClientDriver , ожидания записываются.
  • Посмотрите, как мы устанавливаем базовый URL с помощью driver.getBaseUrl ()

С помощью rest-client-driver мы также можем записать ответ о статусе http, используя метод giveEmptyResponse :

01
02
03
04
05
06
07
08
09
10
11
@Test(expected=IllegalStateException.class)
public void http_errors_should_throw_an_exception() {
 
 driver.addExpectation(
   onRequestTo('reposlordofthejarsnosqlunitissues')
     .withMethod(Method.GET), giveEmptyResponse().withStatus(401));
 
 GithubClient githubClient = new GithubClient(driver.getBaseUrl());
 githubClient.invokeGetMethod('reposlordofthejarsnosqlunitissues');
 
}

И, очевидно, мы можем записать положенное действие:

1
2
3
driver.addExpectation(
   onRequestTo('reposlordofthejarsnosqlunitissues').
     .withMethod(Method.PUT).withBody(PUT_MESSAGE, 'applicationjson'), giveEmptyResponse().withStatus(204));

Обратите внимание, что в этом примере мы устанавливаем, что наш запрос должен содержать данное тело сообщения для ответа с кодом состояния 204.
Это очень простой пример, но имейте в виду, что он также работает с такими библиотеками, как gson или jackson . Кроме того, проект rest-driver поставляется с модулем, который можно использовать для подтверждения ответов сервера (например, проект с гарантированным REST ), но эта тема будет рассмотрена в другом посте.

Ссылка: тестирование клиентской части услуг RESTful от нашего партнера JCG Алекса Сото в блоге One Jar To Rule All .