0


0

Djangoの「manage.pyテスト」を使用しながら、settings.pyの「ライブ」データベースで単体テストを実行する

Djangoでデータベースをセットアップしている場合、一時的なテストデータベースで実行するのではなく、TestRunnerが(「settings.py」のDATABASE_ *設定に従って)「ライブ」データベースを使用する方法を教えてください。

たとえば、 settings.py`で指定された live`データベースで次のテストを実行したいと思います。

import unittest

from example import models

class DBDriverTest(unittest.TestCase):
    db testDriver(self):
       "Connect to the live database and drop in sample value."
       m = models.MyModel('hello')
       m.save() # ... save to the live database from settings.py

現在、上記のコードは、構築されたテストデータベースにのみ保存されます。 私のアプリケーションにはデータベース上で動作する複数の並列プロセスがあるため、これは非常に制限されています。また、ユニットテストは、「ライブ」データベースに物事を送り込み、短時間のスリープ後の位置を確認する機能がないため、不完全(および一貫性のない)になります。

私が考えることができる2つの潜在的なオプションは次のとおりです。

  1. Django APIを介してプラグインし、「手動」で接続する方法を見つけます settings.pyのデータベース

  2. 「ライブ」データベースへの低レベル接続を手動で作成する それを埋める

前者は、DjangoのパブリックAPIの下にあるものに依存しているため、問題があります。 後者は、データベースに依存しないDjangoデータベースAPIを無視し、より手作業が集中するため、問題があります。

あなたの考えと意見に感謝します。

ブライアン

1 Answer


2


すべてのテストは単独で実行され、実行後にデータベースはクリアされるため、独自の test_runner` tearDown`メソッドを定義する必要があります。 あなたは自分の `test_runner`を構築するだけであなたが求めていることをすることができます、私たちは一度ウェブサービスによってアクセスされたデータベースでそれをやりました(チームでは私ではありませんでした)そこから何かを削除する方法はありますが、データベース全体を手動で削除します;-)これはかなり楽しかったです。

質問に答える:独自の test_runner`を作成し、作成したオブジェクトのみを削除する独自の tearDown`メソッドを作成する準備をします。 どうにか「主キー」をそこに保存する必要があるので、ライブデータベースから何も削除しません。

ただし、これは良い方法だとは思わない。 稼働中のデータベースでテストを実行することは、災害を自問しています。 遅かれ早かれ、これで問題が発生します。 代わりに、ライブデータベースをダンプし、このデータからhttp://docs.djangoproject.com/en/dev/topics/testing/#fixture-loading[fixtures]を準備して、テストで使用する必要があります。 これは十分に文書化されており、簡単に実行できます。 このようにして、貴重なデータを危険にさらすことなくライブ環境を作成でき、独自の「test_runner」を作成する必要がありません。 私の意見ではこれが最良かつ最も安全な方法です。