Как выполнить модульные тесты с базой данных h2, где используется bpchar? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть приложение spring + hibernate, которое использует базу данных postgres. Мне нужно написать модульные тесты для контроллеров. Для тестов я хотел использовать базу данных h2, но, к сожалению, тестовые сбои во время create-drop оставляли мне информацию о том, что тип данных bpchar недопустим. Интересно, как решить эту проблему, чтобы я мог запустить тесты.

Я не могу изменить свои столбцы с bpchar на varchar, он должен оставаться как есть. Я также пытался установить режим postgresql, но это не помогло. Прав ли я, что единственное решение, которое у меня есть, - это использовать встроенную базу данных postgres для выполнения тестов, или есть какой-то другой подход, который я мог бы использовать?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Один интересный подход к этому вопросу - Тестовые контейнеры

Поскольку Postgres не имеет встроенного режима, но вы можете использовать вышеупомянутую инфраструктуру для запуска док-контейнера перед тестом, создать схему и применить миграции, если вы используете что-то вроде Flyway или Liquibase или интегрируете свое собственное решение .

Идея состоит в том, что контейнер будет подготовлен и доступен для теста при его запуске. После прохождения теста (независимо от фактического результата, успеха или неудачи) вы можете остановить контейнер.

Запуск контейнера может быть довольно дорогим (считанные секунды), однако вы можете воспользоваться конфигурациями пружинного кэширования во время тестов, поэтому, когда начинается первый тест в модуле, контейнер фактически запускается, однако используется повторно между тестами и тестовыми случаями, поскольку контекст приложения не запускается заново.

Поддержание чистоты базы данных между тестами также становится тривиальной задачей из-за аннотации Spring @Transactional, которую вы помещаете в тестовый случай, так что Spring искусственно откатывает транзакцию после каждого теста. Поскольку в Postgres даже команды DDL могут быть транзакционными, этого должно быть достаточно.

Единственное ограничение этого подхода заключается в том, что у вас должен быть доступный докер на сборочной машине или локальной машине разработки, если вы планируете запускать эти тесты локально (в Linux и Mac OS это не проблема, в любом случае, но в Windows вы для установки среды докера требуется по крайней мере Windows 10 Professional Edition).

Я использовал этот подход в реальных проектах и ​​нашел его очень эффективным для интеграционного тестирования.

0 голосов
/ 03 июня 2019

Прав ли я, что единственное решение, которое у меня есть, - это использовать встроенную базу данных postgres для выполнения тестов, или есть какой-то другой подход, который я мог бы использовать?

Вы пытаетесь использоватьспецифичный для postgres тип данных с h2 (у которого его нет).Конечно, это не работает.

Если вы не можете изменить тип этого поля - используйте встроенные postgres в тестах.

...