66

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

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

編集

これが私がそれをしている方法です:

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

それが役に立てば幸い。

4

6 に答える 6

74

ここで提供される答えhttps://stackoverflow.com/a/7651002/465673は、それを行うためのはるかにクリーンな方法だと思います。

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

import sys

TESTING = sys.argv[1:2] == ['test']
于 2012-07-06T17:28:42.467 に答える
56

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

それほど大規模ではないハックは、独自の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)
于 2013-04-08T23:09:47.727 に答える
23

ユースケースについてはよくわかりませんが、テストスイートが実行されていることを検出する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チケット#7835、特にコメント#24の一部を以下に示します。

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

于 2011-08-05T18:20:37.960 に答える
12

私は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)。私はその明快さが好きです。

于 2016-08-21T18:22:17.577 に答える
3

さて、あなたは単にこのように環境変数を使うことができます:

export MYAPP_TEST=1 && python manage.py test

次に、settings.pyファイル内:

import os

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

if TEST:
    # Do something
于 2018-10-26T15:26:53.237 に答える
0

私はDjangoクラスベースの設定を使用しています。パッケージの「switcher」を使用して、次の別の構成/クラスをロードしますtesting=True

switcher.register(TestingSettings, testing=True)

私の構成でBaseSettingsProductionSettings、、、、などがあります。これらはDevelopmentSettingsTestingSettings必要に応じて互いにサブクラス化します。BaseSettings私は持っていますIS_TESTING=False、そして私はそれをにTestingSettings設定しましたTrue

クラスの継承をクリーンに保つとうまく機能します。import *しかし、 Django開発者が通常使用する方法よりもうまく機能することがわかりました。

于 2020-07-16T23:42:18.533 に答える