Статьи

Тестирование клиентской части сервисов RESTful (без использования мошенничества)


Люди говорят мне А и Б, Они говорят мне, как я должен видеть, То, что я видел, уже ясно, поэтому они толкают меня потом из стороны в сторону (Я хочу выйти — Helloween)


Разработка приложения, использующего

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


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

Первое, что нужно сделать, это добавить
зависимость
rest-client-driver :
<dependency>
    <groupId>com.github.rest-driver</groupId>
    <artifactId>rest-client-driver</artifactId>
    <version>1.1.27</version>
    <scope>test</scope>
</dependency>

 
Следующим шагом мы собираемся создать очень простое
приложение на Джерси,
которое просто вызывает метод get для требуемого
URI.
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("application/json")
.accept("application/json").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 .
Теперь мы можем начать писать тест:
@Rule
public ClientDriverRule driver = new ClientDriverRule();

@Test
public void issues_from_project_should_be_retrieved() {

driver.addExpectation(
onRequestTo("/repos/lordofthejars/nosqlunit/issues").
withMethod(Method.GET), giveResponse(GET_RESPONSE));

GithubClient githubClient = new GithubClient(driver.getBaseUrl());

String issues = githubClient.invokeGetMethod("/repos/lordofthejars/nosqlunit/issues");
assertThat(issues, is(GET_RESPONSE));	

}

  • Мы используем ClientDriverRule   @Rule аннотации добавить клиентский драйвер для тестирования.
  • И затем, используя методы, предоставленные классом RestClientDriver , ожидания записываются.
  • Посмотрите, как мы устанавливаем базовый URL с помощью driver.getBaseUrl ()

С помощью
rest-client-driver мы также можем записать ответ о статусе http, используя
метод
giveEmptyResponse :
@Test(expected=IllegalStateException.class)
public void http_errors_should_throw_an_exception() {

driver.addExpectation(
onRequestTo("/repos/lordofthejars/nosqlunit/issues")
.withMethod(Method.GET), giveEmptyResponse().withStatus(401));

GithubClient githubClient = new GithubClient(driver.getBaseUrl());
githubClient.invokeGetMethod("/repos/lordofthejars/nosqlunit/issues");

}


И, очевидно, мы можем записать положенное действие:
Обратите внимание, что в этом примере мы устанавливаем, что наш запрос должен содержать данное тело сообщения для ответа с кодом состояния 204.

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

Я желаю, чтобы вы нашли этот пост полезным.

Мы продолжаем учиться,

Алекс.