Что такое Spring Boot тесты и чем они отличаются от юнит тестов
Что проверяют
Различаете ли вы тест на свой код и тест на свою конфигурацию и понимаете ли, сколько стоит поднятый контекст. Вопрос вполне практический: от ответа зависит, идёт сборка минуты или полчаса.
Как отвечать
Юнит-тест проверяет класс в изоляции: объект создаётся конструктором, зависимости подменяются заглушками, Spring не участвует вовсе. Если класс так собрать нельзя, это признак, что зависимости внедряются не через конструктор.
Тест Spring Boot поднимает контекст приложения, и под проверку попадает ровно то, чего юнит не видит: собрался ли граф бинов, подхватились ли свойства, сериализуется ли ответ в ожидаемый JSON, валиден ли запрос к базе, откатывается ли транзакция.
Градация, которую ждут в ответе:
- срезы: аннотация веб-слоя поднимает только контроллеры с конвертерами, аннотация слоя данных только репозитории и базу. Быстрее полного контекста и точнее по смыслу;
- полный
@SpringBootTest, при необходимости с реальным портом, когда проверяется сквозной сценарий; - подмена бина заглушкой прямо в контексте, когда нужно отрезать внешний сервис;
- настоящая база в контейнере вместо встроенной: диалект и поведение должны совпадать с продом.
Вывод формулируется одной фразой: юнитов много и они быстрые, интеграционных мало и они проверяют стыки.
Где спотыкаются
Ставят полный контекст на каждый тестовый класс и получают сборку, которую все ждут и никто не запускает локально. Приложение поднимается ради проверки, для которой хватило бы обычного объекта и заглушки.
Не знают про кеш контекста и ломают его случайно. Контекст переиспользуется между классами, пока совпадает конфигурация, а каждая новая комбинация заглушек и свойств создаёт ещё один. Отсюда прогоны, где время растёт быстрее числа тестов.
Полагаются на откат транзакции и считают, что проверили сохранение. Внутри транзакции изменения могут не дойти до базы, и нарушение ограничения всплывёт на настоящей записи уже в проде. Заодно появляется зависимость от порядка тестов, если данные всё же остаются.