Чем отличаются модульное и интеграционное тестирование
Что проверяют
Понимаете ли вы, что различие в границе проверки, и знаете ли, что даёт каждый уровень.
Как отвечать
Модульное проверяет один компонент в изоляции. Всё внешнее подменено: база, сеть, файловая система, время. Тест выполняется за миллисекунды, не требует окружения и точно указывает на место поломки.
Интеграционное проверяет взаимодействие: код с настоящей базой, обработчик запроса со всей цепочкой, обмен с внешним сервисом. Медленнее, требует окружения, но ловит то, что модульные принципиально не видят.
Сравним по свойствам:
- граница: один компонент против нескольких;
- зависимости: подменены против настоящих;
- скорость: миллисекунды против секунд;
- что ловит: ошибки в логике против ошибок на стыках;
- точность диагностики: падение указывает на конкретный метод против «где-то в цепочке»;
- хрупкость: модульный ломается от рефакторинга, интеграционный от изменения окружения.
Ключевая мысль: они ловят разные дефекты и не заменяют друг друга. Модульные покрывают варианты и краевые случаи, потому что дёшевы и их можно писать десятками. Интеграционные проверяют, что запрос к базе действительно верен, что схема совпадает, что транзакция откатывается, что сериализация работает. Ни один модульный тест с подменённым репозиторием этого не покажет: он проверяет, что заглушка вернула то, что в неё положили.
Про пропорции: модульных много, интеграционных заметно меньше, сквозных единицы. Чем выше уровень, тем дороже поддержка и тем выше нестабильность.
Терминология в командах гуляет: одни называют интеграционным любой тест с базой, другие только проверку между сервисами. На собеседовании безопаснее дать определение своими словами, а не спорить о канонической формулировке.
Где спотыкаются
Называют модульным тест, поднимающий контекст приложения и базу.
Подменяют всё подряд и проверяют работу заглушек.
Строят набор из одних интеграционных тестов и получают долгий нестабильный прогон.
Считают, что высокое покрытие модульными тестами снимает необходимость в интеграционных.