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() { Maprequest = 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() { SetmovieSet = 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 .