2009-03-05 6 views
3

私は頻繁に私のdjangoプロジェクトのテストケースを実行します。しかし1つの 良い日私は実際にdjangoが の設定をチェックしていることが私に発生しました.DATABASE_NAME dbはテストケースの実行中に実際に存在します。 これはなぜそうですか。私が思ったのは、djangoが の設定.ATABASE_NAMEを受け取り、 'test_' + settings.DATABASE_NAMEと呼ばれるテスト・データベースを作成します。また、 name = settings.DATABASE_NAMEのデータベースが実際に存在するかどうかを確認します( の場合はテストデータベースを作成します)。理想的に言えば、名前だけが にチェックされるべきですが、db権限の実際の存在は確認されませんか?djangoが実際にテストケースを実行するための設定がDATABASE_NAMEデータベースに存在するかどうかを確認する理由は何ですか?

私はdjangoのソースコードを閲覧し、実際にはtestdbの作成に使用された「接続」がDATABASE設定オプションを使用して作成されていることを確認しました。すべては、実際の存在ではなく、設定の価値について悩まされるべきです。右?

答えて

3

すてきな質問...あなたが知っている、これは私には決してなかった。 DATABASE_NAMEが実際に存在することを確認するには、が必要ですが、テストデータベースを作成するにはデータベースに接続する必要があります。ほとんどのデータベースは、接続文字列を作成するためにDATABASE_NAMEを受け入れます(そして必要とするものもあります)。これは、接続先のデータベース名が接続セッションのアクセス許可に寄与しているためです。

テストデータベースがまだ存在しないため、djangoはまず、テストデータベースを作成するために、通常の設定である.DATABASE_NAMEを使用して接続する必要があります。

だから、それは次のように動作します。

  • Djangoのテストランナは、バックエンド固有のデータベースハンドラ
  • にオフ渡すバックエンド固有のデータベースハンドラがに、通常の設定を使用しますcreate_test_dbと呼ばれる機能を持っていますデータベースに接続します。通常の設定値を使用する明白なcursor = self.connection.cursor()コマンドを使用してこれを行います。これは、この時点ですべてが存在することが分かっているためです。
  • データベースに接続すると、バックエンド固有のハンドラは、新しいテストデータベースの名前を持つCREATE DATABASEコマンドを発行します。
  • バックエンド固有のハンドラが接続を終了し、テストランナーに戻り、test_database_nameの通常のsettings.DATABASE_NAMEをスワップします
  • テストは正常に実行されます。その後のすべてのconnection.cursor()の呼び出しは通常の設定モジュールを使用しますが、そのモジュールはスワップアウトされたデータベース名を持ちます
  • 最後に、テストランナーは、バックエンド固有のハンドラーのdestroy_test_db関数を呼び出した後に古いデータベース名を復元します。

興味がある場合は、主要な部分の関連コードはdjango.db.backends.creationにあります。 _create_test_db関数を見てください。

Djangoデザイナーは、すべてのDBが接続文字列に現在のデータベース名を必要としているわけではないので、DBベースで例外を作成することは可能ですが、リファクタリングが少し必要です。現時点では、create_test_db関数は実際にはbackendの基本クラスの1つに含まれており、実際のバックエンドハンドラのほとんどはそれをオーバーライドしないため、下流にプッシュして各バックエンドに複製するかなりの量のコードがあります。

+0

恐ろしいジャレット!ありがとう –

+0

+1ソースを掘り出してください。 –

関連する問題