Що таке інтеграційне тестування?
Інтеграційне тестування перевіряє, як кілька компонентів працюють разом: застосунок і база даних, сервіс і зовнішнє API, два мікросервіси між собою. Окремо кожна частина може бути справною, а на стику все одно виникне помилка.
Типові дефекти цього рівня — саме стикувальні: розбіжність форматів даних, змінений контракт API, неправильна обробка помилок сусіднього сервісу, проблеми з транзакціями.
На відміну від модульних тестів, інтеграційні запускають на реальних або близьких до реальних залежностях, тому вони повільніші й складніші в налаштуванні. Їх зазвичай менше, але саме вони ловлять те, що не видно зсередини окремого модуля.
Де застосовується
Інтеграційні перевірки закривають найдорожчі помилки — ті, що виникають на стиках. Застосунок і база даних, сервіс і платіжний шлюз, два мікросервіси, що обмінюються повідомленнями: окремо кожна частина справна, а разом вони розходяться у форматі даних чи в обробці помилок.
У сучасних проєктах такі тести запускають на справжніх залежностях, піднятих у контейнерах: реальна база замість заглушки, локальний брокер повідомлень, емулятор зовнішнього API. Це повільніше за модульні тести, тому їх зазвичай виділяють в окремий етап конвеєра.
Приклад
Сервіс замовлень зберігає суму як ціле число копійок, а сервіс звітів очікує дробове значення у гривнях. Модульні тести обох проходять успішно — розбіжність видно лише в інтеграційному тесті, де вони обмінюються реальним повідомленням.
Часті запитання
Чим інтеграційне тестування відрізняється від модульного?
Модульний тест перевіряє одну функцію в ізоляції і підміняє всі залежності. Інтеграційний перевіряє кілька компонентів разом, зі справжньою базою чи сервісом. Він повільніший і складніший у налаштуванні, але ловить помилки, які модульним тестам принципово недоступні.
Чи потрібна для таких тестів справжня база даних?
Бажано та сама, що в продакшені — інакше частина відмінностей лишиться непоміченою. Стандартний сьогодні підхід: піднімати базу в контейнері на час прогону тестів. Це дає реалістичність і при цьому не потребує спільного стенда, який команда ділить між собою.
Як тестувати інтеграцію із зовнішнім сервісом?
Найчастіше його підміняють керованою заглушкою — сервером, який відповідає заздалегідь заданими відповідями, включно з помилками й таймаутами. Так перевіряється і штатна поведінка, і реакція на збій. Звертатися до реального стороннього сервісу в тестах ризиковано й нестабільно.
Скільки інтеграційних тестів потрібно?
Помітно менше, ніж модульних: вони дорожчі в підтримці й повільніші. Розумна стратегія — щільно закривати логіку модульними тестами, а інтеграційними перевіряти ключові звʼязки і сценарії, де розбіжність контрактів призведе до реальних втрат.