Определить режим тестирования Django - PullRequest
44 голосов
/ 05 августа 2011

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

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

EDIT

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

* * 1010

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

Ответы [ 5 ]

47 голосов
/ 06 июля 2012

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

Поместите это в свои настройки.

42 голосов
/ 09 апреля 2013

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

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

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

7 голосов
/ 21 августа 2016

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

1 голос
/ 26 октября 2018

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

export MYAPP_TEST=1 && python manage.py test

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

import os

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

if TEST:
    # Do something
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...