В заметке описаны инструменты тестирования REST и примеры использования.
А чем, собственно, проблема?
На тех проектах, где работал, тестировщики в основном использовали ручное тестирование. И даже больше - интеграционное тестирование backend как-то не очень-то и проводится. Тут и философия scrum "помогает" не тратить много время на тестирование, когда каждый релиз выпускается с какими-то оговорками. И, с другой стороны, ограничения службы безопасности и т.д. и т.п. Мне, как разработчику backend, интересно протестировать сервис, а конкретно REST, со стороны backend. И unit тесты тут не помогут. Ручное тестирование (Postman, httpie) только для каких-то разовых операций. Нужно автоматизированное тестирование REST и просмотр результатов в читабельном формате (allure).
Тестирование Python инструментами
Behave-restful
https://github.com/behave-restful/behave-restful
Первый ОЧЕНЬ МОЩНЫЙ инструмент, с которым я встретился, и в котором есть все, что нужно. Но Python. Тестировщик должен его знать и корпоративные условия (секьюрность, сам python, библиотеки) должны позволять его использовать. А сам инструмент фантастика! Понятно, что появились наследники идеи (см. ниже JBehave и позже RestAssured).
Тестирование Java инструментами
Схема тестирования: создать отдельный проект с тестами, и с помощью maven/gradle проводить тестирование сервисов.
JUnit
Интеграционное тестирование JUnit5 с выводом результатов в Allure
RestTemplate
Смысл простой: через RestTemplate обращаться к целевому сервису и полученный ответ как-то проверять (JSONPath, Vert.x). Или с помощью ObjectMapper конвертировать JSON в Java class и там уже использовать обычные Java тесты.
OkHttp
https://square.github.io/okhttp/
Feign client
Другой клиент для обращения к Rest, но сразу-же можно получать Java объекты. Т.е. проверяются не "голые" JSON, а объекты Java. https://www.baeldung.com/intro-to-feign
NOTE: Не может работать с binary данными (загрузка, получение файлов).
JBehave
Retrofit
https://square.github.io/retrofit/
Примеры:
https://www.vogella.com/tutorials/Retrofit/article.html
RestAssured
https://rest-assured.io/
Пример использования
Rest Assured Tutorial
Пример теста:
@Test public void lotto_resource_returns_200_with_expected_id_and_winners() { when(). get("/lotto/{id}", 5). then(). statusCode(200). body("lotto.lottoId", equalTo(5), "lotto.winners.winnerId", hasItems(23, 54)); }
Возможно , пригодятся параметры продолжения тестирования, если текущий тест упал:
$ gradle --continue ... $ mvn install -Dmaven.test.failure.ignore=true $ mvn --fail-at-end test $ mvn -fae test
Вопросы
- Где вести проект с интеграционными тестами? В отдельном проекте. Возможно, придется копировать слой DTO (или организовывать DTO как отдельную библиотеку?). Интеграционное тестирование подразумевает не завязываться на библиотеки проекта и организовывать тестирование, как бы, взглядом тестировщика, и тогда тестировщик должен вести свой слой DTO, согласно постановке задачи, как он ее видит.
- Разделение на тесты и перенос полученных значений одного теста в другой тест. Одно из решений с помощью RestAssured: Pass Value From One API to Another
- Это не UNIT тесты, это интеграционные тесты. При обычном UNIT тестировании, можно откатить, например, состояние базы данных установкой режима транзакций. Но интеграционное тестирование это не только база данных.
- И всегда-ли возможно установить состояние базы данных в состояние на которое рассчитывает тест (что-то типа "mvn flyway:migrate")? И что такое начальное состояние БД для конкретного теста? Реализация одного из решений в https://github.com/cherepakhin/vacancy_backend_rest_test/blob/main/src/test/kotlin/ru/perm/v/vacancy/restassured/rest/VacancyRestTest.kt
- Другие внешние ресурсы (очереди, др. смежные сервисы). Как-то бы мокать все эти дела или использовать @Before../@After... Реализация одного из решений в https://github.com/cherepakhin/vacancy_backend_rest_test/blob/main/src/test/kotlin/ru/perm/v/vacancy/restassured/rest/VacancyRestTest.kt
- Авторизация
- Тестирование бизнес ПРОЦЕССОВ и уже УСТАНОВЛЕНОГО ГДЕ-ТО СОСТОЯНИЯ процесса. (эххх... где они, эти бизнес процессы?) На одном из проектов удалось внедрить Camunda, но чего это стоило...
Еще материалы
Всякие мелочи типа валидатора JSON схемы и т.п. (Конкретно, для JSON, например, есть такой https://github.com/networknt/json-schema-validator. Примеры использования: https://www.baeldung.com/introduction-to-json-schema-in-java/ )
Много примеров в самых разных вариантах тестирования (Java, Kotlin, JUnit4, JUnit5, Gradle, Maven ...) с выводом в Allure Reports: https://github.com/allure-examples https://github.com/allure-examples
Возможности Allure https://allure-framework.github.io/allure-demo/5/