Почему интеграционные тесты на H2 вместо реальной СУБД считают ненадёжными?
- Зачем Testcontainers в тестах Spring?
H2 — не та база, что в проде: другой диалект, типы, функции, блокировки и изоляция. Тест проходит на H2 и падает в PostgreSQL. Testcontainers поднимает настоящую базу в Docker на время тестов.
- Spring Boot 3.1+: @ServiceConnection — настройки подключения подставляются автоматически
- Переиспользование контейнера между тестами — быстро
- Те же контейнеры для Kafka, Redis, RabbitMQ
А ещё Миграции (Flyway, Liquibase) проверяются тем же тестом
Подробно
Режим совместимости у H2 приближает синтаксис, но не воспроизводит поведение: нативные запросы с особенностями PostgreSQL, JSON-типы, оконные функции, upsert, семантика уровней изоляции и блокировок, работа последовательностей — всё это способно разойтись. В результате тест даёт ложную уверенность, а ошибка обнаруживается в production. Testcontainers решает проблему радикально: тест поднимает в Docker ту же версию СУБД, что и в бою. Цена — необходимость Docker в окружении сборки и время старта контейнера, которое снижают переиспользованием контейнера между тестами и общим для всего набора экземпляром. Тот же подход применяют к Kafka, Redis и другим зависимостям.
Что хотят услышать
- Почему H2 не проверяет реальное поведение.
- Testcontainers и @ServiceConnection.
Частые ошибки
- Проверять на H2 миграции, написанные под конкретную СУБД.
- Поднимать новый контейнер на каждый тестовый класс вместо переиспользования.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗H2 работает медленнее реальной базы, и тесты не укладываются в таймауты CI
- ✗H2 не поддерживает транзакции
- ✗H2 несовместим с Spring Data JPA
- ✓Диалект, типы и блокировки не как в боевой СУБД — тест зелёный, а в бою падает
Что спросят дальше
- Как сократить время старта контейнеров в наборе тестов?
- Где H2 всё-таки уместен?
Разбор темы
- Тестирование Spring Boot
Пирамида тестов, unit без Spring, slice-тесты, @SpringBootTest и @MockBean, MockMvc/WebTestClient, Testcontainers и контрактные тесты.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.