web-dev-qa-db-ja.com

検出Djangoテストモード

私は再利用可能なDjangoアプリを作成しており、アプリがテストモードの場合にのみそのモデルが同期されるようにする必要があります。カスタムDjangoTestRunnerを使用しようとしましたが、その方法の例は見つかりませんでした(ドキュメントには、カスタムテストランナーの定義方法のみが示されています)。

それで、誰かがそれを行う方法のアイデアを持っていますか?

[〜#〜]編集[〜#〜]

ここに私がそれをやっている方法があります:

#in settings.py
import sys
TEST = 'test' in sys.argv

それが役に立てば幸い。

46
Herberth Amaral

私はここで提供された答え https://stackoverflow.com/a/7651002/46567 はそれを行うはるかにきれいな方法だと思います:

これをsettings.pyに入れてください:

import sys

TESTING = sys.argv[1:2] == ['test']
47
jjmaestro

選択された答えは大規模なハックです。 :)

それほど大規模でないハックは、独自のTestSuiteRunnerサブクラスを作成して設定を変更するか、アプリケーションの残りの部分に必要な他のことを行うことです。設定でテストランナーを指定します。

TEST_RUNNER = 'your.project.MyTestSuiteRunner'

一般的に、これはしたくないですが、どうしても必要な場合は機能します。

from Django.conf import settings
from Django.test.simple import DjangoTestSuiteRunner

class MyTestSuiteRunner(DjangoTestSuiteRunner):
    def __init__(self, *args, **kwargs):
        settings.IM_IN_TEST_MODE = True
        super(MyTestSuiteRunner, self).__init__(*args, **kwargs)

注:Django 1.8以降、DjangoTestSuiteRunnerは非推奨になりました。代わりにDiscoverRunnerを使用してください:

from Django.conf import settings
from Django.test.runner import DiscoverRunner


class MyTestSuiteRunner(DiscoverRunner):
    def __init__(self, *args, **kwargs):
        settings.IM_IN_TEST_MODE = True
        super(MyTestSuiteRunner, self).__init__(*args, **kwargs)
42
Travis Jensen

ユースケースについてはよくわかりませんが、テストスイートが実行されていることを検出する1つの方法は、Django.core.mailに次のようなoutbox属性があるかどうかを確認することです。

from Django.core import mail

if hasattr(mail, 'outbox'):
    # We are in test mode!
    pass
else:
    # Not in test mode...
    pass

この属性は、Django setup_test_environmentのテストランナーによって追加され、teardown_test_environmentで削除されます。ソースはこちらで確認できます: https:// code。 djangoproject.com/browser/Django/trunk/Django/test/utils.py

編集:モデルをテスト専用に定義したい場合は、 Django ticket#7835 をチェックアウトする必要があります。特に comment#24 の一部を以下に示します。

どうやら、tests.pyで直接モデルを直接定義できます。 Syncdbはtests.pyをインポートしないため、これらのモデルは通常のdbに同期されませんが、テストデータベースに同期され、テストで使用できます。

19
Mark Lavin

Settings.pyオーバーライドを使用しています。私はほとんどのものが含まれているグローバルsettings.pyを持っているので、それを上書きしています。各設定ファイルは次で始まります:

from myproject.settings import settings

次に、一部の設定を上書きします。

  • prod_settings.py-プロダクション設定(例:DEBUG = Falseをオーバーライドする)
  • dev_settings.py-開発設定(例:より多くのログ)
  • test_settings.py

次に、基本のsettings.pyでUNIT_TESTS = Falseを定義し、test_settings.pyでUNIT_TESTS = Trueにオーバーライドできます。

次に、コマンドを実行するたびに、実行する設定を決定する必要があります(例:Django_SETTINGS_MODULE=myproject.test_settings ./manage.py test)。私はその明快さが好きです。

7

まあ、あなたは単にこのように環境変数を使うだけです:

export MYAPP_TEST=1 && python manage.py test

その後、あなたのsettings.pyファイル:

import os

TEST = os.environ.get('MYAPP_TEST')

if TEST:
    # Do something
1
turkus