Получить доступ

Почему интеграционные тесты на H2 вместо реальной СУБД считают ненадёжными?

MiddleТестирование Spring BootTestcontainersSpring BootSpring Boot >=3.1
Ещё спрашивают так:
  • Зачем Testcontainers в тестах Spring?
Коротко

H2 — не та база, что в проде: другой диалект, типы, функции, блокировки и изоляция. Тест проходит на H2 и падает в PostgreSQL. Testcontainers поднимает настоящую базу в Docker на время тестов.

  • Spring Boot 3.1+: @ServiceConnection — настройки подключения подставляются автоматически
  • Переиспользование контейнера между тестами — быстро
  • Те же контейнеры для Kafka, Redis, RabbitMQ

А ещё Миграции (Flyway, Liquibase) проверяются тем же тестом

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Режим совместимости у H2 приближает синтаксис, но не воспроизводит поведение: нативные запросы с особенностями PostgreSQL, JSON-типы, оконные функции, upsert, семантика уровней изоляции и блокировок, работа последовательностей — всё это способно разойтись. В результате тест даёт ложную уверенность, а ошибка обнаруживается в production. Testcontainers решает проблему радикально: тест поднимает в Docker ту же версию СУБД, что и в бою. Цена — необходимость Docker в окружении сборки и время старта контейнера, которое снижают переиспользованием контейнера между тестами и общим для всего набора экземпляром. Тот же подход применяют к Kafka, Redis и другим зависимостям.

Что хотят услышать

  • Почему H2 не проверяет реальное поведение.
  • Testcontainers и @ServiceConnection.

Частые ошибки

  • Проверять на H2 миграции, написанные под конкретную СУБД.
  • Поднимать новый контейнер на каждый тестовый класс вместо переиспользования.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Диалект, типы, поведение блокировок и специфичный SQL отличаются от production — тест зелёный, а в бою запрос падает или ведёт себя иначе
  • ✗H2 работает медленнее реальной базы
  • ✗H2 не поддерживает транзакции
  • ✗H2 несовместим с Spring Data JPA

Что спросят дальше

  • Как сократить время старта контейнеров в наборе тестов?
  • Где H2 всё-таки уместен?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем