Есть ли встроенный PostgreSql, чтобы мы могли unit test наше приложение, управляемое PostgreSql?
Так как PostgreSql имеет некоторые диалекты, лучше использовать встроенный PostgreSql, чем другие встроенные базы данных.
Есть ли встроенный PostgreSql, чтобы мы могли unit test наше приложение, управляемое PostgreSql?
Так как PostgreSql имеет некоторые диалекты, лучше использовать встроенный PostgreSql, чем другие встроенные базы данных.
Нет, нет встроенного PostgreSQL в смысле загружаемой в процессе работы базы данных как библиотека. PostgreSQL ориентирован на процесс; каждый сервер имеет один поток, и он запускает несколько процессов для выполнения работы. Это не имеет смысла как библиотека.
База данных H2 поддерживает ограниченное подмножество PostgreSQL SQL диалект и использование драйвера PgJDBC.
Что вы можете сделать, это initdb
новая временная база данных, запустите ее с pg_ctl
на рандомизированном порту, чтобы он не конфликтует с другими экземплярами, запускайте ваши тесты, затем используйте pg_ctl
, чтобы остановить его и, наконец, удалить временную базу данных.
Я настоятельно рекомендую запускать временные postgres на нестандартном порту, чтобы вы не столкнулись с каким-либо локально установленным PostgreSQL на машине, на которой выполнялись тесты.
(Существует "встроенный PostgreSQL в смысле ecpg, по существу, клиент PostgreSQL, встроенный в исходный код C в качестве препроцессора на основе C языковых расширений.Это по-прежнему требует работающего сервера, и это немного противно использовать, а не рекомендуется. Это в основном существует, чтобы упростить перенос из других баз данных.)
Это "встроенный" сервер PostgresSQL, который был разработан для модульного тестирования с Java:
https://github.com/yandex-qatools/postgresql-embedded
Встроенный postgresql обеспечит нейтральный путь платформы для запуска двоичного файла postgres в модульных тестах. Большая часть кода была создана из процесса встраивания Flapdoodle OSS
В стороне также существуют аналогичные проекты для Mongo, Redis, Memcached и nodejs.
Я попробовал проект, предложенный @btyernay (yandex-qatools). Я провел несколько дней с этим и без каких-либо обид, над конструктивным решением, которое не работает в моем случае, поскольку я хотел загрузить двоичные файлы из внутреннего хранилища, а не в общедоступный интернет. Теоретически это поддерживает, но на самом деле это не так.
В итоге я использовал otj-pg-embedded, и он работает как шарм. Это было упомянуто в комментариях, поэтому я подумал, что я также упомянул об этом здесь.
Я использовал его как автономную БД, а не по правилу как для модульных тестов, так и для локальной разработки.
Зависимость:
<dependency>
<groupId>com.opentable.components</groupId>
<artifactId>otj-pg-embedded</artifactId>
<version>0.7.1</version>
</dependency>
Код:
@Bean
public DataSource dataSource(PgBinaryResolver pgBinaryResolver) throws IOException {
EmbeddedPostgres pg = EmbeddedPostgres.builder()
.setPgBinaryResolver(pgBinaryResolver)
.start();
// It doesn't not matter which databse it will be after all. We just use the default.
return pg.getPostgresDatabase();
}
@Bean
public PgBinaryResolver nexusPgBinaryResolver() {
return (system, machineHardware) -> {
String url = getArtifactUrl(postgrePackage, system + SEPARATOR + machineHardware);
log.info("Will download embedded Postgre package from: {}", url);
return new URL(url).openConnection().getInputStream();
};
}
private static String getArtifactUrl(PostgrePackage postgrePackage, String classifier) {
// Your internal repo URL logic
}
Если вы хотите запустить in-process версию postgres из набора для интеграции (или аналогичного), postgresql-embedded работал отлично для меня.
Я написал small maven plugin, который можно использовать как оболочку maven вокруг раздвоенной версии postgresql-embedded.
Вы можете использовать экземпляр container для PostgreSQL.
Поскольку вращение контейнера происходит через несколько секунд, это должно быть достаточно хорошим для unittests.
Кроме того, в случае, если вам необходимо сохранить данные, например. для расследования вам не нужно сохранять весь контейнер, только файлы данных, которые могут отображаться вне контейнера.
Один из примеров того, как это сделать, можно найти здесь.