リポジトリをテストする方法がわかりません。
すべてのパラメータを含むオブジェクトをデータベースに実際に保存したことを確認したいのですが、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を使用できません。
これに対する最善の解決策は、 testing.postgresql
モジュールを使用することです。これにより、ユーザースペースでデータベースが起動され、実行の最後に再び削除されます。必要な永続性に応じて、以下をユニットテストスイートに配置できます(setUp
、setUpClass
、または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