Вопрос или проблема
В моем текущем проекте я не могу установить docker, локальную базу данных и другие вещи для тестирования новой функциональности, поэтому мне нужно использовать zonkyio/embedded-database-spring-test. Проблема в том, что в миграционных файлах мы используем функцию из модуля uuid_ossp, который установлен на основном сервере, но zonky не устанавливает его во время запуска сервера, из-за чего мои тесты завершаются с ошибками. Как я понял, zonky позволяет использовать свойства postgres для инициализации базы данных, например, так:
zonky.test.database.postgres.initdb.properties.lc-numeric=cs_CZ.UTF-8
zonky.test.database.postgres.server.properties.shared_buffers=512MB
Вы можете найти больше примеров здесь. Итак, как я вижу, эти свойства не появляются ниоткуда – это реальные свойства postgres, поэтому мой вопрос: есть ли какое-либо свойство, которое позволит мне выполнить этот запрос
CREATE EXTENSION "uuid-ossp";
Я нашел некоторые свойства, такие как shared_preload_libraries, local_preload_libraries и т.д. в разделе документации postgres 9.11.3. Но похоже, что это не то, что мне нужно, потому что, как я гуглил, библиотеки – это не то же самое, что и модули. Так есть ли решение для моей проблемы? Я думал о добавлении еще одного миграционного файла, но не думаю, что это хорошая идея и практика – добавлять такие файлы только для тестирования.
Ответ или решение
Чтобы предзагрузить модули PostgreSQL перед запуском сервера, необходимо учитывать несколько нюансов, связанных с конфигурацией и доступными возможностями используемых технологий. В вашем случае — с использованием библиотеки Zonky для выполнения интеграционных тестов.
Проблема
Вы столкнулись с ситуацией, когда в миграционных файлах используется функция из модуля uuid-ossp
, который установлен на основном сервере, но не загружается при инициализации базы данных, создаваемой Zonky. Это приводит к сбоям при запуске тестов.
Решение
-
Изучение доступных параметров конфигурации:
Как вы правильно отметили, Zonky позволяет задавать свойства для инициализации базы данных. Однако необходимо выяснить, поддерживает ли Zonky команды для создания расширений PostgreSQL при старте базы данных. -
Использование
script
для создания расширений:
Одним из возможных решений может быть использование SQL-скрипта для предварительного создания необходимых расширений. Таким образом, при создании экземпляра базы данных, вы можете указать полный путь к файлу вашего скрипта, который будет выполняться после инициализации.Например, создать файл
init.sql
со следующим содержимым:CREATE EXTENSION "uuid-ossp";
Затем в вашем
application.properties
илиapplication.yml
файле нужно добавить следующее:zonky.test.database.postgres.initdb.properties.init_file=init.sql
-
Добавление логики в миграции:
Если создание отдельного SQL-файла не подходит, вы можете добавить в первые миграции проверку наличия расширенияuuid-ossp
и его создание в случае отсутствия. Например:DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'uuid-ossp') THEN CREATE EXTENSION "uuid-ossp"; END IF; END $$;
-
Пользовательские инициализации:
Возможно, что Zonky поддерживает инициализацию с использованием пользовательских команд. Убедитесь, что документация по Zonky поддерживает такую функциональность, так как это существенно упростит процесс. -
Обновление документации:
Как только вы найдете работающее решение, было бы полезно обновить внутреннюю документацию проекта на предмет вашего подхода, чтобы другие разработчики могли с легкостью повторить ваш опыт.
Заключение
Использование Zonky для встраивания PostgreSQL в ваши тесты предоставляет гибкость, однако может иногда требовать дополнительных усилий для настройки. Определив, какие расширения или библиотеки необходимы для успешного выполнения ваших миграций, вы можете построить качественно работающий процесс тестирования. Также важно стремиться к поддержанию чистоты и ясности вашей базы данных и миграций, избегая добавления дополнительных файлов только для целей тестирования, если это возможно.
Помните, что до начала тестов база данных должна соответствовать тому состоянию, которое ожидается при работе вашего приложения. Это включает не только созданные таблицы, но и необходимые расширения и функции.