web-dev-qa-db-ja.com

postgresdbのテストpython

リポジトリをテストする方法がわかりません。

すべてのパラメータを含むオブジェクトをデータベースに実際に保存したことを確認したいのですが、SQLステートメントを実行すると、想定どおりの結果が得られました。

しかし、ユニットテストケースのsetUpメソッドに"CREATE TABLE test_table "を入れることはできません。これは、複数回作成されるためです(同じテストケースのテストは並行して実行されます)。したがって、2つのメソッドを作成する限り同じテーブルで動作する必要がある同じクラスでは、動作しません(テーブルの名前の衝突)

同じように、"CREATE TABLE test_table"setUpModuleを置くことはできません。これは、テーブルが1回作成されるためですが、テストは並行して実行されるため、同じオブジェクトをテーブルに複数回挿入することを妨げるものは何もありません。これは、あるフィールドの単一性の制約を破ります。

同様に、特定のデータベースに対してグローバルに「SET search_path TO ...」する必要があるため、すべてのメソッドで"CREATE SCHEMA some_random_schema_name"することはできません。そのため、並行して実行されるすべてのメソッドが影響を受けます。

私が見る唯一の方法は、テストごとに一意の名前で"CREATE DATABASE"を作成し、各データベースへの個別の接続を確立することです。これは非常に無駄に見えます。もっと良い方法はありますか?

また、PostgreSQLをテストする必要があるため、メモリ内でSQLiteを使用できません。

6
dgan

これに対する最善の解決策は、 testing.postgresql モジュールを使用することです。これにより、ユーザースペースでデータベースが起動され、実行の最後に再び削除されます。必要な永続性に応じて、以下をユニットテストスイートに配置できます(setUpsetUpClass、またはsetUpModuleのいずれか)。

import testing.postgresql

def setUp(self):
    self.postgresql = testing.postgresql.Postgresql(port=7654)
    # Get the url to connect to with psycopg2 or equivalent
    print(self.postgresql.url())

def tearDown(self):
    self.postgresql.stop()

テスト間/テスト後もデータベースを保持したい場合は、base_dirオプションを指定してデータベースを実行し、ディレクトリを設定できます。これにより、シャットダウン後にデータベースが削除されなくなります。

name = "testdb"
port = "5678"
path = "/tmp/my_test_db"
testing.postgresql.Postgresql(name=name, port=port, base_dir=path)

テスト以外では、コンテキストマネージャーとしても使用でき、withブロックが終了すると自動的にクリーンアップおよびシャットダウンされます。

with testing.postgresql.Postgresql(port=7654) as psql:
    # do something here
9
match