Вы здесь:

В заметке описаны инструменты тестирования 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

https://jbehave.org/

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/