🧤

Проблематика

При тестировании приложений, использующих базу данных, зачастую требуется проверять корректность SQL запросов. Делать это приходится даже при использовании Spring Data с ее Property Expressions.

Проверку SQL запросов, конечно, хотелось бы автоматизировать, чтобы как можно раньше ловить ошибки, вылезающие например при изменении схемы БД.

До появления тестконтейнеров едва ли не единственным способом автоматизации тестирования было использование In-Memory баз данных типа H2. Но и после того, как тестконтейнеры захватили мир, у H2 осталось множество поклонников.

Сравнение

Недостатки H2

  • В H2 отсутствуют некоторые ключевые слова, существующие в других СУБД. Примеры: TRUNCATE, VIRTUAL и др.
  • В H2 нет многих функций, которые есть в других СУБД. Из-за этого приходится писать неоптимальные sql-запросы в продуктовом коде. Примеры: UNIXTIMESTAMP, DATE и др. функции MySQL
  • При использовании liquibase могут быть различные требования к описанию миграций для различных СУБД. Например, при добавлении nonNullConstraint в MySQL требуется дополнительно указывать тип данных в колонке, а для H2 этого делать не нужно.
  • H2 слишком медленно развивается. Последний релиз был в 2019 г., а поддержка JSON появилась только спустя 7 лет после того как такой тип данных появился в PostgreSQL.

Преимущества H2

  • H2 не требует наличия дополнительного софта на машине, где прогоняются тесты. Тестконтейнеры же требуют наличия docker.
  • Невероятно простая настройка: можно подменить базу всего одной строчкой, изменив значение параметра jdbc-url.
  • Тесты на H2 прогоняются быстрее, из-за долгого старта тестконтейнеров.

Недостатки Testcontainers

  • Тестконтейнеры требуют дополнительной настройки CI: на агентах должен быть docker, в котором должны быть выкачены образы необходимых СУБД.

Выводы

Задача тестирования заключается в том, чтобы проверить вновь написанный функционал и сохранить существующий функционал при изменениях. H2 не гарантирует нахождение всех ошибок, при этом заставляет писать sql-запросы и миграции так, чтобы они были совместимы с H2.

Хотите ли вы использовать для тестирования инструмент, который пропускает ошибки? Вряд ли.

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

Ссылки