PostgreSql駆動型アプリケーションを単体テストできるように、PostgreSqlが埋め込まれていますか?
PostgreSqlにはいくつかの方言があるため、他の組み込みデータベースよりも組み込みPostgreSql自体を使用する方が適切です。
組み込みとは、必ずしもJVMプロセスに組み込む必要があるという意味ではありません。また、必ずしもメモリ内持続性を使用する必要はありません。依存関係管理(Maven、Gradle)によって自動的にロードされるため、ローカルPostgreSQLサーバーをインストールおよび構成することなく、ユニットテストをすべてのマシンで実行できます。
いいえ、インプロセスでロード可能なデータベースとしてのデータベースという意味で、組み込みPostgreSQLはありません。 PostgreSQLはプロセス指向です。各バックエンドには1つのスレッドがあり、作業を行うために複数のプロセスを生成します。ライブラリとしては意味がありません。
H2データベース サポート PostgreSQL SQLダイアレクトの限定サブセット およびPgJDBCドライバーの使用。
あなたがcanすることは initdb
新しい一時データベース で、 pg_ctl
ランダム化されたポートで、他のインスタンスと競合しないように、テストを実行してからpg_ctl
これを停止して、最終的に一時データベースを削除します。
私は強くお勧めします、デフォルト以外のポートで一時的なpostgresを実行することを強くお勧めしますテストを実行しているマシン上のPostgreSQL。
(そこにis " ecpg の意味でPostgreSQLを埋め込み、本質的にはCに埋め込まれたPostgreSQLclientプリプロセッサベースのC言語拡張としてのソースコード。まだ実行中のサーバーが必要であり、使用するのは少し厄介ですが、実際にはお勧めしません。 )
これは、Javaからの単体テスト用に設計された「組み込み」PostgresSQLサーバーです。
https://github.com/yandex-qatools/postgresql-embedded
埋め込みpostgresqlは、単体テストでpostgresバイナリを実行するプラットフォームに依存しない方法を提供します。コードの多くは Flapdoodle OSSの埋め込みプロセス から作成されています
余談ですが、 Mongo 、 Redis 、 Memcached および nodejs の同様のプロジェクトもあります。
@btiernay(yandex-qatools)が提案するプロジェクトを試しました。私はこれにかなりの日数を費やしましたが、攻撃なしでそれは過剰に設計されたソリューションであり、公開インターネットに行くのではなく内部リポジトリからバイナリをダウンロードしたいので私のケースでは機能しません。理論的にはサポートしていますが、実際にはサポートしていません。
私は 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
}
インテグレーション(または同様の)テストスイートからインプロセスバージョンのpostgresを実行する場合、 postgresql-embedded はうまく機能しました。
小さなMavenプラグイン を作成しました。これは、postgresql-embeddedの分岐バージョンのMavenラッパーとして使用できます。