6

データベースが models.py ファイルと同期しているかどうかを示すテストを作成したいと考えています。実際、私はすでにそれらを書いていますが、models.py ファイルに基づいてテストが実行されるたびに、django が新しいデータベースを作成することがわかりました。models.py テストで既存のデータベース スキーマを使用する方法はありますか? /myapp/models.py にあるものではなく、mysql/postgresql にあるものですか?

データベース内のデータは気にしません。スキーマのみを気にします。つまり、データベース内のテーブルのフィールドが、models.py ファイル内のスキーマよりも少ないかどうかをテストで認識させたいのです。

これに関連性がある場合は、ユニットテストフレームワーク(実際にはdjango拡張機能)を使用しています。

ありがとう

4

1 に答える 1

9

テスト対象の新しいデータベースが作成されないように、デフォルトの test_runner をオーバーライドしました。このようにして、現在のローカル データベースがどのようなものであるかに対してテストを実行します。ただし、テストで行ったデータへの変更は永続的なものになるため、この方法を使用する場合は十分に注意してください。すべてのテストで変更が元の状態に復元され、元のバージョンのデータベースがサーバーに保持され、バックアップされていることを確認しました。

これを行うには、run_test メソッドを django.test.simple からプロジェクト内の場所にコピーする必要があります。私は myproject/test/test_runner.py に配置しました。

次に、そのメソッドに次の変更を加えます。

// change
old_name = settings.DATABASE_NAME
from django.db import connection
connection.creation.create_test_db(verbosity, autoclobber=not interactive)
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
connection.creation.destroy_test_db(old_name, verbosity)

// to:
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)

上部で必要なすべてのインポートを行ってから、設定ファイルで設定を行ってください。

TEST_RUNNER = 'myproject.test.test_runner.run_tests'

./manage.py test を実行すると、Django は現在のモデル定義に基づいて新しいバージョンを作成するのではなく、データベースの現在の状態に対してテストを実行します。

他にできることは、データベースのコピーをローカルに作成し、新しい run_test() メソッドで次のようにチェックすることです。

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

そうすれば、メイン データベースに対してテストを実行する危険はありません。

于 2008-09-26T12:32:46.037 に答える