Ответ
Интеграционное тестирование — это уровень тестирования, на котором проверяется взаимодействие и корректность обмена данными между интегрированными модулями, компонентами или системами. Его цель — выявить дефекты на стыках модулей, в интерфейсах, API, контрактах и работе с общими ресурсами (базами данных, очередями, кешем).
Пример теста на Python (с использованием pytest):
# Тест интеграции сервиса заказов с сервисом оплаты и БД
def test_order_placement_integration(order_service, payment_gateway_mock, db_session):
# 1. Arrange: Создаём тестовые данные в БД
test_user = db_session.add(User(name='Ivan'))
test_product = db_session.add(Product(price=100))
# 2. Act: Вызываем метод сервиса заказов, который внутри:
# - обратится к БД (модуль доступа к данным)
# - вызовет мок платежного шлюза (внешний сервис)
# - обновит статус заказа
new_order = order_service.place_order(user_id=test_user.id, product_id=test_product.id)
# 3. Assert: Проверяем интеграцию всех компонентов
assert new_order.status == 'PAID'
assert payment_gateway_mock.was_called_with(amount=100)
# Проверяем, что заказ действительно сохранён в БД
order_in_db = db_session.get(Order, new_order.id)
assert order_in_db is not None
Ключевые аспекты для QA:
- Расположение в пирамиде тестирования: Следует после модульного тестирования и перед системным (end-to-end).
- Подходы: «Снизу вверх» (от низкоуровневых модулей к UI), «сверху вниз» (от UI к низкоуровневым) или «большой взрыв» (всё сразу).
- Основные объекты проверки: Передача данных, обработка ошибок, корректность ответов/исключений, состояние общих ресурсов после взаимодействия.
- Инструменты: Часто требуются моки и стабы для изоляции тестируемого контура от внешних нестабильных или медленных зависимостей.
Ответ 18+ 🔞
А, интеграционное тестирование! Ну это, блядь, тот самый момент, когда отдельные модули, которые вроде бы сами по себе работают как часы, начинают общаться друг с другом. И тут-то, ёпта, и начинается настоящий цирк. Представь: один модуль кричит «дай!», другой мычит «на!», а третий вообще молча в сраку пинает. Вот чтобы этого не было, и нужны эти тесты.
По сути, это проверка не самих функций, а стыков между ними. API, базы данных, очереди сообщений — вся эта, блядь, инфраструктура, через которую они переписываются. Цель — поймать косяки там, где один кусок кода передаёт другому какую-то хуйню вместо данных, или когда оба думают, что обращаются к одному и тому же, а на деле — к разным вещам.
Вот смотри на этот пример кода (его не трогаем, он святой):
def test_order_placement_integration(order_service, payment_gateway_mock, db_session):
test_user = db_session.add(User(name='Ivan'))
test_product = db_session.add(Product(price=100))
new_order = order_service.place_order(user_id=test_user.id, product_id=test_product.id)
assert new_order.status == 'PAID'
assert payment_gateway_mock.was_called_with(amount=100)
order_in_db = db_session.get(Order, new_order.id)
assert order_in_db is not None
Видишь, что здесь происходит? Это же чистая интеграция, ядрёна вошь! Мы не тестируем, как order_service там внутри циклы крутит. Мы проверяем цепочку: БД -> Сервис -> Внешний платёжный шлюз -> снова БД. Упало что-то на любом этапе — тест провален. Вот это и есть суть.
На что смотреть, если ты тестировщик, а не просто мартышлюшка с клавиатурой:
- Место в пищевой цепочке: Это после unit-тестов, но до этих жирных и медленных end-to-end проверок. Золотая середина, блядь.
- Как подходить: Можно собирать систему снизу вверх, как конструктор. Можно сверху вниз — от самого главного интерфейса вглубь. А можно по-русски — «большой взрыв»: собрать всё в кучу, запустить и охуеть от количества ошибок. Последний способ, конечно, для мазохистов.
- Что ловить: Всё, что на стыке. Правильно ли данные передались? А если внешний сервис ответил ошибкой — наше приложение не сдохло, а красиво ругнулось? Состояние базы данных после всех операций не превратилось в кашу? Вот это всё.
- Чем работать: Без моков и стабов тут вообще никуда. Потому что ждать ответа от реального платёжного гейта, который тупит, или от сервиса погоды, который сегодня не работает — это, прости, доверия ебать ноль. Подменяем их заглушками, которые ведут себя предсказуемо, и тестируем именно нашу логику взаимодействия.
Короче, смысл в том, чтобы убедиться, что все эти умные модули, когда их собирают вместе, работают как одна команда, а не как гомосеки налетели и начали выяснять, кто тут главный.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶