web-dev-qa-db-ja.com

Java JUnitテスト用の埋め込みPostgreSQL

PostgreSql駆動型アプリケーションを単体テストできるように、PostgreSqlが埋め込まれていますか?

PostgreSqlにはいくつかの方言があるため、他の組み込みデータベースよりも組み込みPostgreSql自体を使用する方が適切です。

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

39
blue123

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

H2データベース サポート PostgreSQL SQLダイアレクトの限定サブセット およびPgJDBCドライバーの使用。

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

私は強くお勧めします、デフォルト以外のポートで一時的なpostgresを実行することを強くお勧めしますテストを実行しているマシン上のPostgreSQL。

(そこにis " ecpg の意味でPostgreSQLを埋め込み、本質的にはCに埋め込まれたPostgreSQLclientプリプロセッサベースのC言語拡張としてのソースコード。まだ実行中のサーバーが必要であり、使用するのは少し厄介ですが、実際にはお勧めしません。 )

34
Craig Ringer

これは、Javaからの単体テスト用に設計された「組み込み」PostgresSQLサーバーです。

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

埋め込みpostgresqlは、単体テストでpostgresバイナリを実行するプラットフォームに依存しない方法を提供します。コードの多くは Flapdoodle OSSの埋め込みプロセス から作成されています

余談ですが、 MongoRedisMemcached および nodejs の同様のプロジェクトもあります。

46
btiernay

@btiernay(yandex-qatools)が提案するプロジェクトを試しました。私はこれにかなりの日数を費やしましたが、攻撃なしでそれは過剰に設計されたソリューションであり、公開インターネットに行くのではなく内部リポジトリからバイナリをダウンロードしたいので私のケースでは機能しません。理論的にはサポートしていますが、実際にはサポートしていません。

OpenTable Embedded 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
}
20
Jan Zyka

インテグレーション(または同様の)テストスイートからインプロセスバージョンのpostgresを実行する場合、 postgresql-embedded はうまく機能しました。

小さなMavenプラグイン を作成しました。これは、postgresql-embeddedの分岐バージョンのMavenラッパーとして使用できます。

3
aramcodez

container PostgreSQLのインスタンスを使用できます。

コンテナの回転は数秒であるため、これは単体テストに十分なはずです。さらに、データを永続化する必要がある場合、たとえば調査のために、コンテナ全体を保存する必要はなく、データファイルのみを保存する必要があります。データファイルは、コンテナの外部にマッピングできます。

これを行う方法の例の1つは、 here です。

3
Arik