Обнаружение режима тестирования django

Я пишу многоразовое приложение django, и мне нужно убедиться, что его модели только синхронизируются, когда приложение находится в тестовом режиме. Я попытался использовать пользовательский DjangoTestRunner, но я не нашел примеров того, как это сделать (документация показывает только, как определить пользовательский тестовый бегун).

Итак, кто-нибудь знает, как это сделать?

ИЗМЕНИТЬ

Вот как я это делаю:

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

Надеюсь, что это поможет.

Ответ 1

Я думаю, что приведенный здесь ответ fooobar.com/questions/51214/... - это гораздо более чистый способ сделать это:

Поместите это в свои settings.py:

import sys

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

Ответ 2

Выбранный ответ - массивный взлом.:)

Менее массивным взломом будет создание собственного подкласса 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)

Ответ 3

Не совсем уверен в вашем случае использования, но один из способов, который я видел для обнаружения, когда работает тестовый пакет, - проверить, есть ли 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, часть из которых приводится ниже:

По-видимому, вы можете просто определить модели непосредственно в test.py. Syncdb никогда не импортирует tests.py, поэтому эти модели не будут синхронизироваться с normal db, но они будут синхронизированы с тестовой базой данных и могут быть используемых в тестах.

Ответ 4

Я использую переопределения settings.py. У меня есть global settings.py, который содержит большинство вещей, а затем у меня есть переопределения. Каждый файл настроек начинается с:

from myproject.settings import settings

а затем переопределите некоторые параметры.

  • prod_settings.py - производственные настройки (например, переопределяет DEBUG = False)
  • dev_settings.py - настройки разработки (например, больше протоколирования)
  • test_settings.py

И затем я могу определить UNIT_TESTS = False в базовых settings.py и переопределить его в UNIT_TESTS = True в test_settings.py.

Затем всякий раз, когда я запускаю команду, мне нужно решить, какие параметры нужно выполнить (например, DJANGO_SETTINGS_MODULE=myproject.test_settings ./manage.py test). Мне нравится эта ясность.