私は再利用可能なDjangoアプリを作成しており、アプリがテストモードの場合にのみそのモデルが同期されるようにする必要があります。カスタムDjangoTestRunnerを使用しようとしましたが、その方法の例は見つかりませんでした(ドキュメントには、カスタムテストランナーの定義方法のみが示されています)。
それで、誰かがそれを行う方法のアイデアを持っていますか?
[〜#〜]編集[〜#〜]
ここに私がそれをやっている方法があります:
#in settings.py
import sys
TEST = 'test' in sys.argv
それが役に立てば幸い。
私はここで提供された答え https://stackoverflow.com/a/7651002/46567 はそれを行うはるかにきれいな方法だと思います:
これをsettings.pyに入れてください:
import sys
TESTING = sys.argv[1:2] == ['test']
選択された答えは大規模なハックです。 :)
それほど大規模でないハックは、独自の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)
ユースケースについてはよくわかりませんが、テストスイートが実行されていることを検出する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に同期されませんが、テストデータベースに同期され、テストで使用できます。
Settings.pyオーバーライドを使用しています。私はほとんどのものが含まれているグローバルsettings.pyを持っているので、それを上書きしています。各設定ファイルは次で始まります:
from myproject.settings import settings
次に、一部の設定を上書きします。
次に、基本のsettings.pyでUNIT_TESTS = Falseを定義し、test_settings.pyでUNIT_TESTS = Trueにオーバーライドできます。
次に、コマンドを実行するたびに、実行する設定を決定する必要があります(例:Django_SETTINGS_MODULE=myproject.test_settings ./manage.py test
)。私はその明快さが好きです。
まあ、あなたは単にこのように環境変数を使うだけです:
export MYAPP_TEST=1 && python manage.py test
その後、あなたのsettings.py
ファイル:
import os
TEST = os.environ.get('MYAPP_TEST')
if TEST:
# Do something