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