djangoデータベーススキーマをテストするにはどうすればよいですか?
-
02-07-2019 - |
質問
データベースがmodels.pyファイルと同期しているかどうかを示すことができるテストを書きたいです。実際には、djangoがmodels.pyファイルに基づいてテストを実行するたびに新しいデータベースを作成することを知るためだけに、すでにそれらを作成しました。 models.pyテストで既存のデータベーススキーマを使用する方法はありますか? /myapp/models.pyにあるものではなく、mysql / postgresqlにあるものですか?
データベースにあるデータは気にせず、スキーマにしか気をつけないmodels.pyファイル。
これに関連性がある場合、私はunittestフレームワーク(実際にはそれに対するdjango拡張機能)を使用しています。
ありがとう
解決
テスト対象の新しいデータベースが作成されないように、デフォルトの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は現在のモデル定義に基づいて新しいバージョンを作成するのではなく、データベースの現在の状態に対してテストを実行します。
もう1つできることは、データベースのコピーをローカルに作成し、次のように新しい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)
そのようにして、メインデータベースに対してテストを実行する危険はありません。