Open6

Django FW のテスト戦略メモ

Djangoでpytestを利用するためには、拡張プラグインであるpytest-djangoを利用すると良い

  • DjangoSettingの設定
  • DBアクセスに関する設定
    等のツールを提供してくれている。

pytestを利用するにはDjangoSettingの読み込みが必要で、pytest-djangoを利用すると、pytest.iniに以下のようにsettingsモジュールを読み込むように設定する。

[pytest]
DJANGO_SETTINGS_MODULE = (settingsがあるapp).settings

pytestを利用する中で、DBアクセスが発生すると以下のようなエラーに遭遇する

RuntimeError: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.

これは、DBアクセスをするfixtureないしテスト関数に明示的にDBアクセスを利用することを伝えないと行けないらしいここ

で、特にハマるのがfixtureのscopeをclass以上に設定したときにDBアクセスがうまくできなくなる問題がある(@pytest.mark.djano_dbを利用してもエラーがでる)
これはここで詳しく議論されている

結論としては、公式のここの設定をすることで利用可能にはなる

で実際に以下のような最初に1万件のデータセットを愚直に用意してその後のTestケースで利用するのをpytestで書いてみた、意図したとおり最初にセットアップに多少の時間を要し、その後は素早くテストが実行された。(scopeをclassにできた)

https://github.com/Hyuga-Tsukui/python_sandbox/blob/660ae03d917c890e38f02ec8a86dbe4a350f00c2/mysite/polls/tests.py#L4-L45

django_db_setupはSessionスコープでテストDBが利用できることを保証するfixture
これを使うとmigrateまでしっかりやってくれる。リストアなどのcleanup処理は別途必要

django_db_blockerはpytest-djangoのdbセーフな安全装置を外すコンテキストを提供するfixture
このコンテキスト内であれば、dbの設定の変更はもちろんデータ生成も自由
リストアなどのcleanup処理は別途必要

なので、上のコードだとSessionレベルではデータがcleanupされてないので注意

https://github.com/Hyuga-Tsukui/python_sandbox/blob/master/mysite/polls/tests.py

だからこれが通る

ログインするとコメントできます