it-swarm.com.ru

Определить режим тестирования Django

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

Итак, кто-нибудь имеет представление о том, как это сделать?

ПРАВКА

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

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

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

39
Herberth Amaral

Я думаю, что ответ, представленный здесь https://stackoverflow.com/a/7651002/465673 - это гораздо более чистый способ сделать это:

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

import sys

TESTING = sys.argv[1:2] == ['test']
41
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)
41
Travis Jensen

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

18
Mark Lavin

Я использую настройки settings.py. У меня есть глобальный 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). Мне нравится эта ясность.

7
Amichai Schreiber

Ну, вы можете просто использовать переменные окружения следующим образом:

export MYAPP_TEST=1 && python manage.py test

затем в вашем файле settings.py:

import os

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

if TEST:
    # Do something
0
turkus