(インメモリPostgreSQLの使用から私の回答を移動して一般化する):
あなたはインプロセス、インメモリでPgを実行することはできません
テストのためにインメモリPostgresデータベースを実行する方法がわかりません。出来ますか?
いいえ、できません。PostgreSQLはCで実装され、プラットフォームコードにコンパイルされます。H2やDerbyとは異なり、jar
をロードして使い捨てのインメモリDBとして起動することはできません。
Cでも記述され、プラットフォームコードにコンパイルされるSQLiteとは異なり、PostgreSQLもインプロセスでロードできません。マルチスレッド化ではなくマルチプロセッシングアーキテクチャであるため、複数のプロセス(接続ごとに1つ)が必要です。マルチプロセッシング要件手段は、あなたがしなければならないスタンドアロン・プロセスとしてのpostmasterを起動します。
代わりに、接続を事前設定してください
特定のホスト名/ユーザー名/パスワードが機能することを期待してテストをCREATE DATABASE
作成し、使い捨てデータベースをテストハーネスDROP DATABASE
に設定して、実行の最後に実行することをお勧めします。プロパティファイルからデータベース接続の詳細を取得し、ターゲットプロパティ、環境変数などをビルドします。
単体テストに指定するユーザーがスーパーユーザーではなく、CREATEDB
権限を持つユーザーである限り、気になるデータベースがすでに存在する既存のPostgreSQLインスタンスを使用しても安全です。最悪の場合、他のデータベースでパフォーマンスの問題が発生します。そのため、テストのために完全に分離されたPostgreSQLインストールを実行することを好みます。
代わりに、使い捨てのPostgreSQLインスタンスをテスト用に起動します
あなたがしている場合は別の方法として、本当にあなたは可能性が熱心持っているあなたのテストハーネスを見つけinitdb
およびpostgres
実行バイナリ、initdb
修正、データベースを作成するのpg_hba.conf
にtrust
実行し、postgres
DBを作成し、ユーザーを作成し、ランダムなポート上で起動して、テストを実行します。複数のアーキテクチャのPostgreSQLバイナリをjarにバンドルし、テストを実行する前に、現在のアーキテクチャのバイナリを一時ディレクトリに解凍することもできます。
個人的には、それは避けなければならない大きな痛みだと思います。テストDBを構成するだけの方が簡単です。ただし、でのinclude_dir
サポートの登場により、少し簡単になりましたpostgresql.conf
。これで、1行追加するだけで、残りすべての生成された構成ファイルを書き込むことができます。
PostgreSQLを使用したより高速なテスト
テスト目的でPostgreSQLのパフォーマンスを安全に改善する方法の詳細については、このトピックで以前に書いた詳細な回答を参照してください:高速テストのためのPostgreSQLの最適化
H2のPostgreSQL方言は真の代用ではありません
代わりに、PostgreSQL方言モードでH2データベースを使用してテストを実行する人もいます。これは、テストにSQLiteを使用し、本番環境にPostgreSQLを使用しているRailsの人々と同じくらい悪いと思います。
H2はいくつかのPostgreSQL拡張機能をサポートし、PostgreSQL方言をエミュレートします。ただし、それだけです-エミュレーション。H2がクエリを受け入れるがPostgreSQLは受け入れない、動作が異なるなどの領域があります。また、執筆時点で、ウィンドウ関数のように、PostgreSQLがH2だけでは実行できない処理をサポートしている場所もたくさんあります。
このアプローチの制限を理解していて、データベースへのアクセスが簡単であれば、H2は大丈夫かもしれません。しかしその場合は、とにかく興味深い機能を使用していないため、データベースを抽象化するORMのより良い候補となるでしょう。その場合、データベースの互換性を気にする必要はありません。
テーブルスペースは答えではありません!
「インメモリ」データベースの作成にテーブルスペースを使用しないでください。とにかくパフォーマンスを大幅に向上させることができないので、それは不必要であるだけでなく、同じPostgreSQLインストールで気になる可能性のある他のすべてへのアクセスを中断する優れた方法でもあります。9.4ドキュメントには、次の警告が含まれています。
警告
メインのPostgreSQLデータディレクトリの外にある場合でも、テーブルスペースはデータベースクラスターの不可欠な部分であり、データファイルの自律的なコレクションとして扱うことはできません。これらはメインデータディレクトリに含まれるメタデータに依存しているため、別のデータベースクラスターにアタッチしたり、個別にバックアップしたりすることはできません。同様に、テーブルスペースを失うと(ファイルの削除、ディスク障害など)、データベースクラスターが読み取り不能になるか、起動できなくなる可能性があります。ramdiskのような一時ファイルシステムにテーブルスペースを配置すると、クラスター全体の信頼性が低下します。
あまりにも多くの人がこれをやっていて、トラブルに遭遇していることに気づいたからです。
(これを行った場合mkdir
、不足しているテーブルスペースディレクトリを使用してPostgreSQLを再起動できますDROP
。不足しているデータベースやテーブルなどがあります。実行しない方がよいでしょう。)