Тестирование вместе со Spring Boot. Часть 1

Статья подготовлена для студентов курса «Разработчик на Spring Framework» в образовательном проекте OTUS.

С появлением Spring Boot появилась масса возможностей для тестирования различных слоёв. Итак, у нас есть приложение c backend и UI. UI использует backend, а backend содержит следующий код:

Данный код содержит REST контроллер, который получает и изменяет объекты Person, используя PersonRepository. Этот контроллер возвращает/принимает JSON и он будет использовать UI приложения с помощью AJAX.

Также присутствует специальный класс PersonDto, который будет маппиться в JSON. Этот класс нужен для того, чтобы зафиксировать формат JSON и можно было править доменный класс Person независимо и не изменять формат JSON, который используется на UI приложения.

В нашем коде не предусмотрено никакого Spring Security и методы должны возвращаться вне зависимости от аутентификации и авторизации.

Что же мы хотим протестировать и для чего?

Есть несколько кейсов, где тесты действительно нужны, итак: 1. Контроллер отправляет и принимает PersonDto, а работает с доменными сущностями Person. Эти преобразования осуществляются с помощью статических методов PersonDto и должны быть покрыты тестами просто по правилам приличия. 2. Конкретный PersonDto преобразуется в JSON в методе получения и используется на UI. Нам хочется зафиксировать формат JSON, который будет возвращаться, чтобы при исправлениях в backend приложения мы не изменили этот формат и не поломали UI. 3. JSON с данными о Person также отправляется c UI на backend, плюс хочется также проверить, что отправляемые сейчас данные будут корректно приниматься backend-ом. 4. Контроллер по идее возвращает 200 OK всегда при существующих данных, поэтому хочется зафиксировать данное поведение при каждом запросе.

Поехали?

Для тестирования статических методов, никакого SpringBoot и не надо!

Зафиксируем теперь формат JSON, в который превращается DTO. Вот здесь и помогает SpringBoot — в данном случае аннотация @JsonTest инициализирует контекст и включает Jackson в той конфигурации, что используется в проекте.

А вот теперь пришла пора проверить, как десериализуется JSON. В случае сложных DTO и различных по виду запросов стоит такие фикстуры создать для каждого более-менее отличного запроса, желательно реального, взятого из браузера или из логов.

А теперь осталось написать Unit-тест на контроллер. На самом деле не так просто определить зону ответственности контроллера, т. е. какой функционал покрыть тестами. Основная задача контроллера — это иметь дело с HTTP-запросами и ответами и правильно вызывать бизнес-метод. Именно это и протестируем, оставив формат зафиксированным в тесте на DTO.

В Spring Boot имеется аннотация @WebMvcTest, которая позволяет писать как раз такие unit-тесты:

Здесь Spring Boot c помощью @WebMvcTest (PersonController.class) создаёт фейковое окружение с настроенным Spring MVC и входящим в него Jackson, причём именно в том виде, в каком они настроены в реальном приложении.

  • Далее мы создаём запрос с помощью mockMvc, кстати, его можно настраивать.
  • А далее мы пишем набор matсher-ов, которые проверяют запрос, здесь можно проверить также и контент, и HTTP-заголовки.

Вот такими манипуляциями можно проверить и View-слой SpringBoot приложения. А как проверить DAO/Repository-слой, мы узнаем в следующей заметке.

Есть вопрос? Пишите комментарий!

Материал подготовлен для студентов курса «Разработчик на Spring Framework» в образовательном проекте OTUS. Чтобы присоединиться к ближайшей группе, обязательно пройдите вступительное тестирование:

ПРОЙТИ ТЕСТИРОВАНИЕ