Подтвердить что ты не робот

Встроенный PostgreSql

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

В стороне также существуют аналогичные проекты для Mongo, Redis, Memcached и nodejs.

Ответ 3

Я попробовал проект, предложенный @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
}

Ответ 4

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

Я написал small maven plugin, который можно использовать как оболочку maven вокруг раздвоенной версии postgresql-embedded.

Ответ 5

Вы можете использовать экземпляр container для PostgreSQL.

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

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