(インメモリPostgreSQLの使用とそれを一般化することから私の答えを移動します):
Pgをインプロセス、インメモリで実行することはできません
テストのためにインメモリPostgresデータベースを実行する方法がわかりません。出来ますか?
いいえ、できません。PostgreSQLはCで実装され、プラットフォームコードにコンパイルされます。H2やDerbyとは異なり、をロードしjar
て使い捨てのインメモリDBとして起動することはできません。
これもCで記述され、プラットフォームコードにコンパイルされるSQLiteとは異なり、PostgreSQLはインプロセスでロードすることもできません。マルチスレッドアーキテクチャではなくマルチプロセッシングであるため、複数のプロセス(接続ごとに1つ)が必要です。マルチプロセッシング要件は、ポストマスターをスタンドアロンプロセスとして起動する必要があることを意味します。
代わりに:接続を事前設定します
特定のホスト名/ユーザー名/パスワードが機能することを期待するテストを作成し、実行の最後にテストCREATE DATABASE
に使い捨てデータベースを利用させることをお勧めします。DROP DATABASE
プロパティファイルからデータベース接続の詳細を取得し、ターゲットプロパティ、環境変数などを構築します。
単体テストに提供するユーザーがスーパーユーザーではなくCREATEDB
、権限を持つユーザーのみである限り、関心のあるデータベースが既に存在する既存のPostgreSQLインスタンスを使用しても安全です。最悪の場合、他のデータベースでパフォーマンスの問題が発生します。そのため、テストのために完全に分離されたPostgreSQLインストールを実行することを好みます。
代わりに:テスト用に使い捨てのPostgreSQLインスタンスを起動します
または、テストハーネスでとバイナリを検索し、実行してデータベースを作成し、に変更して、実行してランダムポートで開始し、ユーザーを作成し、DBを作成して、テストを実行することもできます。テストを実行する前に、複数のアーキテクチャ用のPostgreSQLバイナリをjarにバンドルし、現在のアーキテクチャ用のPostgreSQLバイナリを一時ディレクトリに解凍することもできます。initdb
postgres
initdb
pg_hba.conf
trust
postgres
個人的には、それは避けるべき大きな痛みだと思います。テスト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
欠落しているデータベース、テーブルなどを実行できます。実行しない方がよいでしょう。)