Один модуль работает - отлично. Второй тоже - супер. А вместе они, казалось бы, должны работать ещё лучше. Но на практике всё может пойти не так. Именно здесь в игру вступает интеграционное тестирование, которое проверяет, как взаимодействуют части системы между собой.
Что такое интеграционное тестирование?
Интеграционное тестирование (Integration Testing) - это этап тестирования, на котором проверяется взаимодействие между модулями, компонентами или внешними системами.
Если юнит-тест - это проверка деталей двигателя, то интеграционное тестирование - это тест, заводится ли машина, когда всё собрано.
Зачем оно нужно?
Отдельные модули могут работать идеально, но на стыке между ними часто появляются ошибки:
- Проблемы с форматами данных, таймингами, зависимостями
- Ошибки из-за разных версий библиотек, API, протоколов
- Нестабильная работа при взаимодействии с внешними сервисами
Интеграционное тестирование помогает обнаружить дефекты именно во взаимодействии, а не в отдельных компонентах.
Когда проводится?
- После юнит-тестов
- После сборки нескольких связанных модулей
- При работе с внешними API, базами данных, брокерами сообщений
- После изменений в связующем коде или контракте между модулями
Примеры интеграций, которые стоит тестировать
- Frontend ↔ Backend (REST API, GraphQL и т. д.)
- Сервис ↔ База данных
- Один микросервис ↔ Другой микросервис
- Backend ↔ Внешний платёжный шлюз
- Сервис ↔ Очередь сообщений (Kafka, RabbitMQ)
- Backend ↔ Email-сервис, S3, Auth-провайдеры
Типы интеграционного тестирования
Big Bang
Все модули собираются и тестируются сразу. Просто, но сложно локализовать ошибки.
Инкрементальное (поэтапное)
Модули добавляются постепенно, тестируется их взаимодействие на каждом шаге.
- Восходящее (Bottom-Up): от низкоуровневых компонентов к верхнеуровневым
- Нисходящее (Top-Down): от интерфейса к внутренним модулям
- Сэндвич (Sandwich): комбинация обоих подходов
Как пишутся интеграционные тесты?
- Собирается реальная или эмуляторная среда
- Поднимаются зависимости (реальные или мок-сервисы)
- Выполняется набор тестов, который:
- Отправляет запросы между модулями
- Проверяет корректность взаимодействия
- Валидирует данные, ошибки, таймауты
Инструменты:
- pytest + requests + docker-compose
- Go + TestContainers
- SpringBootTest
- Postman + Newman
- Jest + supertest (Node.js)
- Playwright / Cypress (UI + API)
Чем отличается от юнит- и системного тестирования?
| Тип теста | Что проверяется | Окружение | Скорость |
|--------------------|---------------------------|-----------------------|------------|
| Юнит-тест | Отдельная функция/метод | Локально, изолировано | Быстро |
| Интеграционный | Взаимодействие компонентов | Сервис + сервис | Средне |
| Системный | Вся система целиком | Почти как прод | Медленно |
Что может пойти не так без интеграционных тестов?
- Сломанный API-контракт между модулями
- Неправильный формат или структура данных
- Проблемы с сериализацией
- Таймауты, гонки, конфликты
- Неочевидные баги на проде, которые не воспроизводятся локально
Полезные советы
- Не тестируй всё через UI - быстрее и стабильнее делать интеграционные тесты на уровне API или кода
- Используй отдельную тестовую среду
- Моки - хорошо, но тесты с реальными сервисами важнее
- Построй pipeline в CI, где интеграционные тесты запускаются отдельно от юнитов
- Не забывай про логи и отладку - при падениях важно видеть оба участника связи