Рубрики
Без рубрики

Получение и проверка данных ответа с уверенностью

Посмотрите, как использовать REST-assured для проверки и извлечения ответа из конечной точки REST

Автор оригинала: baeldung.

1. Обзор

В этом руководстве мы обсудим, как тестировать службы REST с помощью REST-assured, уделяя особое внимание захвату и проверке данных ответов из наших API REST .

2. Настройка для тестового класса

В предыдущих уроках мы изучили REST-assured в целом и показали, как манипулировать заголовками запросов, файлами cookie и параметрами .

Основываясь на этой существующей настройке, мы добавили простой контроллер REST, AppController , который внутренне вызывает службу, AppService . Мы будем использовать эти классы в наших тестовых примерах.

Чтобы создать наш тестовый класс, нам нужно сделать немного больше настроек. Поскольку у нас есть spring-boot-starter-test в нашем пути к классу, мы можем легко использовать утилиты тестирования Spring.

Во-первых, давайте создадим скелет нашего интеграционного теста контроллера приложений класса:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class AppControllerIntegrationTest {

    @LocalServerPort
    private int port;

    private String uri;

    @PostConstruct
    public void init() {
        uri = "http://localhost:" + port;
    }

    @MockBean
    AppService appService;

     //test cases
}

В этом тесте JUnit мы аннотировали наш класс парой специфичных для Spring аннотаций, которые запускают приложение локально в случайном доступном порту. В @PostConstruct мы захватили полный URI , по которому мы будем совершать вызовы REST.

Мы также использовали @MockBean on AppService , так как нам нужно имитировать вызовы методов этого класса.

3. Проверка ответа JSON

JSON-наиболее распространенный формат, используемый в API REST для обмена данными. Ответы могут состоять из одного объекта JSON или массива объектов JSON. Мы рассмотрим и то, и другое в этом разделе.

3.1. Один объект JSON

Допустим, нам нужно проверить конечную точку /movie/{id} , которая возвращает объект Movie JSON, если найден id .

Мы будем имитировать Службу приложений вызовы, чтобы вернуть некоторые фиктивные данные с помощью Mockito framework:

@Test
public void givenMovieId_whenMakingGetRequestToMovieEndpoint_thenReturnMovie() {

    Movie testMovie = new Movie(1, "movie1", "summary1");
    when(appService.findMovie(1)).thenReturn(testMovie);

    get(uri + "/movie/" + testMovie.getId()).then()
      .assertThat()
      .statusCode(HttpStatus.OK.value())
      .body("id", equalTo(testMovie.getId()))
      .body("name", equalTo(testMovie.getName()))
      .body("synopsis", notNullValue());
}

Выше мы впервые высмеяли сервис app.find Movie(1) вызов для возврата объекта. Затем мы построили наш URL-адрес REST в методе get () , предоставленном REST-assured для выполнения запросов GET. Наконец, мы сделали четыре утверждения.

Сначала мы проверили код состояния ответа, а затем тело элементы . Мы используем Hamcrest для утверждения ожидаемого значения.

Также обратите внимание, что если ответ JSON вложен, мы можем проверить вложенный ключ с помощью оператора dot , например “key1.key2.key3” .

3.2. Извлечение ответа JSON после проверки

В некоторых случаях нам может потребоваться извлечь ответ после проверки, чтобы выполнить над ним дополнительные операции.

Мы можем извлечь ответ JSON для класса, используя извлекать() метод:

Movie result = get(uri + "/movie/" + testMovie.getId()).then()
  .assertThat()
  .statusCode(HttpStatus.OK.value())
  .extract()
  .as(Movie.class);
assertThat(result).isEqualTo(testMovie);

В этом примере мы направили REST-assured для извлечения ответа JSON на объект Movie , а затем утвердили его на извлеченном объекте.

Мы также можем извлечь весь ответ на Строка, использование extract().asString() ИНТЕРФЕЙС ПРИКЛАДНОГО ПРОГРАММИРОВАНИЯ:

String responseString = get(uri + "/movie/" + testMovie.getId()).then()
  .assertThat()
  .statusCode(HttpStatus.OK.value())
  .extract()
  .asString();
assertThat(responseString).isNotEmpty();

Наконец, мы также можем извлечь определенное поле из ответа JSON .

Давайте рассмотрим тест для API POST, который ожидает тело Movie JSON и вернет то же самое, если будет успешно вставлен:

@Test
public void givenMovie_whenMakingPostRequestToMovieEndpoint_thenCorrect() {
    Map request = new HashMap<>();
    request.put("id", "11");
    request.put("name", "movie1");
    request.put("synopsis", "summary1");

    int movieId = given().contentType("application/json")
      .body(request)
      .when()
      .post(uri + "/movie")
      .then()
      .assertThat()
      .statusCode(HttpStatus.CREATED.value())
      .extract()
      .path("id");
    assertThat(movieId).isEqualTo(11);
}

Выше мы сначала сделали объект запроса, который нам нужно ОПУБЛИКОВАТЬ. Затем мы извлекли поле id из возвращенного ответа JSON с помощью метода path () .

3.3. Массив JSON

Мы также можем проверить ответ, если это массив JSON:

@Test
public void whenCallingMoviesEndpoint_thenReturnAllMovies() {

Set movieSet = new HashSet<>();
movieSet.add(new Movie(1, "movie1", "summary1"));
movieSet.add(new Movie(2, "movie2", "summary2"));
when(appService.getAll()).thenReturn(movieSet);

get(uri + "/movies").then()
    .statusCode(HttpStatus.OK.value())
    .assertThat()
    .body("size()", is(2));
}

Мы снова сначала высмеяли app Service.get All() с некоторыми данными и сделали запрос на нашу конечную точку. Затем мы утвердили код состояния и размер нашего массива ответов.

Это опять же можно сделать с помощью извлечения:

Movie[] movies = get(uri + "/movies").then()
  .statusCode(200)
  .extract()
  .as(Movie[].class);
assertThat(movies.length).isEqualTo(2);

4. Проверка заголовков и файлов cookie

Мы можем проверить заголовок или файл cookie ответа, используя методы с тем же именем:

@Test
public void whenCallingWelcomeEndpoint_thenCorrect() {
    get(uri + "/welcome").then()
        .assertThat()
        .header("sessionId", notNullValue())
        .cookie("token", notNullValue());
}

Мы также можем извлечь заголовки и файлы cookie по отдельности:

Response response = get(uri + "/welcome");

String headerName = response.getHeader("sessionId");
String cookieValue = response.getCookie("token");
assertThat(headerName).isNotBlank();
assertThat(cookieValue).isNotBlank();

5. Проверка Файлов

Если наш REST API возвращает файл, мы можем использовать метод asByteArray() для извлечения ответа:

File file = new ClassPathResource("test.txt").getFile();
long fileSize = file.length();
when(appService.getFile(1)).thenReturn(file);

byte[] result = get(uri + "/download/1").asByteArray();

assertThat(result.length).isEqualTo(fileSize);

Здесь мы сначала издевались над app Service.get File(1) , чтобы вернуть текстовый файл, который присутствует в нашем src/test/resources path. Затем мы сделали вызов нашей конечной точке и извлекли ответ в byte[] , который, как мы затем утверждали, имеет ожидаемое значение.

6. Заключение

В этом уроке мы рассмотрели различные способы сбора и проверки ответов от наших API REST с помощью REST-assured.

Как обычно, код в этой статье доступен на Github .