встроенный в PostgreSQL

есть ли встроенный PostgreSql, чтобы мы могли модульно протестировать наше приложение, управляемое PostgreSql?

поскольку PostgreSql имеет некоторые диалекты, лучше использовать встроенный PostgreSql, чем другие встроенные базы данных.

5 ответов


нет, нет встроенного PostgreSQL, в смысле загружаемой в процессе базы данных как библиотеки. PostgreSQL ориентирован на процесс; каждый бэкэнд имеет один поток, и он порождает несколько процессов для работы. Это не имеет смысла как библиотека.

база данных H2 поддерживает ограниченное подмножество диалекта SQL PostgreSQL и использование драйвера PgJDBC.

что ты can do is initdb новый временный база данных запустите его с pg_ctl на рандомизированном порту, чтобы он не конфликтовал с другими экземплярами, запустите тесты, затем используйте pg_ctl чтобы остановить его и, наконец, удалить временные базы данных.

Я настоятельно рекомендую что вы управляете временными postgres на порту по умолчанию так вы не рискуете столкновения с любым локально установленный PostgreSQL на машину тесты.

(здесь и "встроенный PostgreSQL в смысле ecpg, по существу PostgreSQL клиент встроенный в C исходный код как расширения языка C на основе препроцессора. Он по-прежнему требует работающего сервера, и это немного неприятно использовать, не рекомендуется. Он в основном существует, чтобы упростить перенос из различных других баз данных.)


это" встроенный " сервер PostgresSQL, который был разработан для модульного тестирования с Java:

https://github.com/yandex-qatools/postgresql-embedded

Embedded postgresql предоставит нейтральный для платформы способ запуска Postgres binary в тесты. Большая часть кода была создана из процесс внедрения Flapdoodle OSS

в стороне, также существуют подобные проекты для Монго, Рэдис, Memcached и nodejs.


я попробовал проект, предложенный @btiernay (yandex-qatools). Я провел с этим несколько дней, и без каких-либо обид это над инженерным решением, которое не работает в моем случае, поскольку я хотел загрузить двоичные файлы из внутреннего репозитория, а не идти в общедоступный Интернет. Теоретически он ее поддерживает, но на самом деле-нет.--3-->

OpenTable Встроенный Компонент PostgreSQL

Я закончил с помощью 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
}

можно использовать контейнер экземпляр PostgreSQL.

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

Один из примеров того, как это сделать, можно найти здесь.


Если вы хотите запустить версию postgres в процессе из набора тестов интеграции (или аналогичного),postgresql-embedded работал штрафа для меня.

Я написал небольшой плагин maven Это можно использовать как оболочку maven вокруг разветвленной версии postgresql-embedded.