Автоматические тесты делят на юнит (unit), интеграционные (integration) и сквозные (end-to-end, E2E), чтобы комплексно покрывать проверку системы на разных уровнях.
История вопроса: Эта классификация появилась из-за необходимости тестировать приложения как по частям, так и в целом. Поэтому выделяют слои тестирования:
Проблема: Ошибки часто возникают не только в логике отдельного метода, но и на стыках компонентов, или при "настоящем" запуске всей системы с внешними сервисами. Если все свалить в одну кучу, трудно быстро локализовать баг или понять, где именно он возник.
Решение:
Различать типы тестов жизненно необходимо, чтобы:
Ключевые особенности:
Можно ли считать интеграционные тесты просто "большими" юнит-тестами?
Нет, интеграционные тесты тестируют работу нескольких компонентов в связке, а не только отдельные функции. При этом не всегда возможно использовать моки — реальные сервисы взаимодействуют друг с другом.
Должны ли все тесты быть сквозными (E2E)?
Нет, это дорогой и сложный подход. E2E нужны только для критичных пользовательских сценариев, большинство логики покрывают другими тестами.
Юнит-тесты всегда быстрые?
Не всегда. Бывает, что изолировать код не удаётся, или у метода зависят сложные внешние ресурсы. В таком случае, тест перестает быть юнитом.
В компании покрыли лишь E2E-тестами основной функционал — каждая правка чекалась ночью, тесты падали нестабильно, баги обнаруживались поздно.
Плюсы:
Минусы:
Команда выстроила тестовую пирамиду: низ — юнит-тесты, середина — интеграционные, верх — только самые важные E2E.
Плюсы:
Минусы: