Баланс между
качеством и дедлайном

Интеграционное тестирование

Один модуль работает - отлично. Второй тоже - супер. А вместе они, казалось бы, должны работать ещё лучше. Но на практике всё может пойти не так. Именно здесь в игру вступает интеграционное тестирование, которое проверяет, как взаимодействуют части системы между собой.

переходник

Что такое интеграционное тестирование?

Интеграционное тестирование (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, где интеграционные тесты запускаются отдельно от юнитов
  • Не забывай про логи и отладку - при падениях важно видеть оба участника связи