Django - как обнаружить тестовую среду - PullRequest
47 голосов
/ 03 ноября 2010

Проблема кажется простой, но, к сожалению, гуглить ее немного сложно.

У меня такой вопрос: как я могу определить, находится ли внутри представления вид, который вызывается в тестовой среде, или нет?

#pseudo_code
def my_view(request):
    if not request.is_secure() and not TEST_ENVIRONMENT:
        return HttpResponseForbidden()

Ответы [ 7 ]

107 голосов
/ 04 октября 2011

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

import sys

TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'

Проверяет, был ли второй аргумент командной строки (после ./manage.py) test. Затем вы можете получить доступ к этой переменной из других модулей, например:

from django.conf import settings

if settings.TESTING:
    ...

Для этого есть веские причины: предположим, вы получаете доступ к некоторому бэкэнд-сервису, кроме моделей Django и соединений с БД. Тогда вам может понадобиться узнать, когда позвонить в производственную службу по сравнению с тестовой службой.

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

Создайте свой собственный подкласс TestSuiteRunner и измените настройку или сделайте все, что вам нужно для остальной части вашего приложения.Вы указываете тестового бегуна в своих настройках:

TEST_RUNNER = 'your.project.MyTestSuiteRunner'

В общем, вы не хотите этого делать, но это работает, если вам это абсолютно необходимо.

14 голосов
/ 17 апреля 2012

Просто посмотрите на request.META['SERVER_NAME']

def my_view(request):
    if request.META['SERVER_NAME'] == "testserver":
        print "This is test environment!"
6 голосов
/ 13 декабря 2013

Я думаю, что лучший подход - запускать свои тесты, используя собственный файл настроек (т.е. settings / tests.py). Этот файл может выглядеть следующим образом (первая строка импортирует настройки из файла настроек local.py):

from local import *
TEST_MODE = True

Затем выполните ducktyping, чтобы проверить, находитесь ли вы в тестовом режиме.

try:
    if settings.TEST_MODE:
        print 'foo'
except AttributeError:
    pass
5 голосов
/ 03 января 2014

Есть также способ временно перезаписать настройки в модульном тесте в Django.В некоторых случаях это может быть более простым / чистым решением.

Вы можете сделать это внутри теста:

with self.settings(MY_SETTING='my_value'):
    # test code

Или добавить его в качестве декоратора в метод теста:

@override_settings(MY_SETTING='my_value')
def test_my_test(self):
    # test code

Вы также можете установить декоратор для всего класса тестового набора:

@override_settings(MY_SETTING='my_value')
class MyTestCase(TestCase):
    # test methods

Для получения дополнительной информации проверьте документы Django: https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.override_settings

1 голос
/ 28 марта 2013

Воспользовавшись ответом @ Tobia, я думаю, что его лучше реализовать в settings.py, например:

import sys
try:
    TESTING = 'test' == sys.argv[1]
except IndexError:
    TESTING = False

Это предотвратит отлов таких вещей как ./manage.py loaddata test.json или ./manage.py i_am_not_running_a_test

0 голосов
/ 17 июня 2019

Хотя нет официального способа проверить, находимся ли мы в тестовой среде, django на самом деле оставляет нам некоторые подсказки.По умолчанию тестовый организатор Django автоматически перенаправляет всю отправленную Django электронную почту на фиктивную исходящую почту .Это достигается путем замены EMAIL_BACKEND в функции с именем setup_test_environment , которая, в свою очередь, вызывается методом DiscoverRunner.Итак, мы можем проверить, установлен ли settings.EMAIL_BACKEND на «django.core.mail.backends.locmem.EmailBackend».Это означает, что мы находимся в тестовой среде.

Менее хакерским решением было бы следовать примеру разработчиков, добавив нашу собственную настройку с помощью подкласса DisoverRunner и затем переопределив метод setup_test_environment.

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