50

PostgreSql駆動型アプリケーションをユニットテストできるように、埋め込まれたPostgreSqlはありますか?

PostgreSqlにはいくつかの方言があるため、他の組み込みデータベースよりも組み込みPostgreSql自体を使用することをお勧めします。

Embeddedは、必ずしもJVMプロセスに埋め込まれている必要があることを意味するわけではありません。また、必ずしもメモリ内の永続性を使用する必要はありません。依存関係管理(Maven、Gradle)によって自動的にロードされる必要があります。これにより、ローカルPostgreSQLサーバーをインストールして構成しなくても、すべてのマシンで単体テストを実行できます。

4

6 に答える 6

36

いいえ、ライブラリとしてのインプロセスロード可能なデータベースという意味で、組み込みのPostgreSQLはありません。PostgreSQLはプロセス指向です。各バックエンドには1つのスレッドがあり、作業を行うために複数のプロセスを生成します。ライブラリとしては意味がありません。

H2データベースは、PostgreSQLSQLダイアレクトの限定されたサブセットとPgJDBCドライバーの使用をサポートします。

実行できるのはinitdb、新しい一時データベースpg_ctlです。他のインスタンスと競合しないようにランダム化されたポートで開始し、テストを実行してから、を使用pg_ctlして停止し、最後に一時データベースを削除します。

テストを実行しているマシンにローカルにインストールされているPostgreSQLと衝突するリスクを回避するために、デフォルト以外のポートで一時的なpostgresを実行することを強くお勧めします。

( 「 ecpgの意味での埋め込みPostgreSQL 、本質的にはプリプロセッサベースのC言語拡張としてCソースコードに埋め込まれたPostgreSQLクライアントあります。それでも実行中のサーバーが必要であり、使用するのは少し厄介ですが、実際には推奨されません。ほとんどの場合、他のさまざまなデータベースからの移植を容易にします。)

于 2013-01-14T06:27:16.750 に答える
30

@btiernay (yandex-qatools) が提案したプロジェクトを試しました。私はこれでかなりの数日を過ごしましたが、公共のインターネットに行くのではなく、内部リポジトリからバイナリをダウンロードしたかったので、私の場合はうまくいきません。理論上はサポートしていますが、実際にはサポートしていません。

OpenTable 組み込み PostgreSQL コンポーネント

私はotj-pg-embeddedを使用することになり、それは魅力のように機能します。コメントで言及されていたので、ここでも言及しようと思いました。

単体テストとローカル開発の両方で、ルールを介さずにスタンドアロン DB として使用しました。

依存:

<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
}
于 2016-12-13T10:52:25.500 に答える