JDBCを介してpostgresデータベースと対話するコードがいくつかあります。ただし、テストの目的で、グローバルなpostgresのインストールを変更したり、ユーザーを管理したりすることなく、新しいデータベースをすばやく作成して接続したいだけです。一般的に、この種のテストはどのように行われますか。
4 に答える
実行可能ファイルを見つけて、initdb
それを使用して、現在のユーザーが書き込み可能な新しいデータベース インスタンスの一時ストレージを作成します。これはテスト インスタンスであるinitdb --auth=trust --username=postgres -D /path/to/temp/datadir
ため、パスワードを必要とせずに接続を受け入れるように新しいデータベースが設定されるように、次のようなものを使用します。
サーバーを起動するために使用pg_ctl
し、ポートを指定して、生成されたデフォルトの設定をオーバーライドし、postgresql.conf
競合を回避します。
新しいデータベース クラスターに接続し、必要な作業を行います。テスト コードに制御を渡す前にpostgres
、最初にユーザーとして接続し、必要なコマンドを実行する必要がCREATE USER
あります。CREATE DATABASE
最後に、 を使用pg_ctl
して停止し、最後にデータ ディレクトリを削除します。
必要なのはinitdb
、pg_ctl
上のPATH
と、サーバーを管理するためのヘルパー クラスだけです。
見る:
テスト用に Postgres の一時インスタンスを簡単に作成できるライブラリがいくつかあります。
- http://github.com/tk0miya/testing.postgresql
- http://github.com/TJC/Test-postgresql
- http://eradman.com/ephemeralpg
これらはすべて、一時データベースを自動的にシャットダウンして削除するように設計されています。これはpg_tmp(1)
、Java から最小限の Postgres インスタンスを作成するために使用する方法です。
import java.io.*;
import java.sql.*;
public class test_pg
{
public static void main(String args[])
{
try {
Process p = Runtime.getRuntime().exec("pg_tmp -t");
BufferedReader input = new BufferedReader
(new InputStreamReader(p.getInputStream()));
String pg_uri = "jdbc:" + input.readLine();
input.close();
System.out.println("Using " + pg_uri);
Connection conn = DriverManager.getConnection(pg_uri);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select now()");
while(rs.next()) {
System.out.print(rs.getString(1));
}
} catch(IOException | SQLException e) {
e.printStackTrace();
}
}
}
ホーム ディレクトリに Postgres のインスタンスをインストールし、別のポートでユーザーの下で実行できます。たとえば、ここを参照してください。
http://www.bacula.org/manuals/en/catalog/catalog/Installi_Configur_PostgreS.html
コードの内容によっては、Heroku でコードをテストすることもできます。小さな仮想 Postgres データベースが無料で提供されます。