Я использую простой тестовый модуль на основе модульных тестов для тестирования моего приложения Django.
Само мое приложение настроено на использование базового логгера в settings.py, используя:
logging.basicConfig(level=logging.DEBUG)
И в моем коде приложения, используя:
logger = logging.getLogger(__name__)
logger.setLevel(getattr(settings, 'LOG_LEVEL', logging.DEBUG))
Однако при запуске юнит-тестов я бы хотел отключить ведение журнала, чтобы он не загромождал вывод результатов моего теста. Есть ли простой способ отключить ведение журнала глобальным способом, чтобы при запуске тестов определенные логгеры приложений не выводили данные на консоль?
python
django
unit-testing
logging
shreddd
источник
источник
Ответы:
отключит все журналы вызовов с уровнями менее серьезными, чем или равными
CRITICAL
. Ведение журнала может быть повторно включено систочник
logging.disable
(из принятого ответа) вверхуtests.py
приложения, в котором ведется ведение журнала.tearDown()
методе:logging.disable(logging.NOTSET)
аккуратно помещает регистрацию на место.tests
модуля очень полезно.Поскольку вы находитесь в Django, вы можете добавить эти строки в settings.py:
Таким образом, вам не нужно добавлять эту строку в каждый
setUp()
тест.Таким образом, вы также можете внести несколько удобных изменений в свои тестовые потребности.
Существует еще один «более приятный» или «более чистый» способ добавить конкретику в ваши тесты, а именно создать собственный тестовый прогон.
Просто создайте такой класс:
А теперь добавьте в ваш файл settings.py:
Это позволяет вам сделать одну действительно удобную модификацию, которой не придерживается другой подход, а именно заставить Django просто протестировать нужные приложения. Вы можете сделать это, изменив
test_labels
добавление этой строки для тестового бегуна:источник
Другие ответы не позволяют «записывать данные на консоль», глобально настраивая инфраструктуру ведения журналов, чтобы она ничего не игнорировала. Это работает, но я считаю это слишком грубым подходом. Мой подход заключается в том, чтобы выполнить изменение конфигурации, которое делает только то, что необходимо для предотвращения выхода журналов на консоль. Поэтому я добавляю собственный фильтр журналирования к своему
settings.py
:И я настраиваю логирование Django для использования фильтра:
Конечный результат: когда я тестирую, ничего не выходит на консоль, но все остальное остается прежним.
Зачем это делать?
Я разрабатываю код, который содержит инструкции по протоколированию, которые запускаются только при определенных обстоятельствах и которые должны выводить точные данные, необходимые для диагностики, если что-то пойдет не так. Поэтому я проверяю, что они делают то, что должны, и, таким образом, полностью отключают ведение журнала, для меня нецелесообразно. Я не хочу найти, как только программное обеспечение будет запущено в производство, что то, что я думал , будет зарегистрировано, не зарегистрировано.
Более того, некоторые организаторы тестов (например, Nose) собирают журналы во время тестирования и выводят соответствующую часть журнала вместе с ошибкой теста. Полезно выяснить, почему тест не удался. Если ведение журнала полностью отключено, то ничего не может быть захвачено.
источник
test_settings.py
файл, который находится рядом с моим проектомsettings.py
. Он настроен для загрузкиsettings.py
и внесения некоторых изменений, например,TESTING_MODE
вTrue
. Мои организаторы тестов организованы таким образом,test_settings
чтобы модуль загружался для настроек проекта Django. Есть много способов сделать это. Я обычно иду с установкой переменной средыDJANGO_SETTINGS_MODULE
вproj.test_settings
.Мне нравится идея Хасека по тестированию бегуна. Следует отметить, что
DjangoTestSuiteRunner
в Django 1.6+ он больше не является стандартным, а заменен наDiscoverRunner
. Для поведения по умолчанию, бегущий тест должен быть больше похож на:источник
helpers
, в котором есть только утилиты, которые не импортируются из других мест проекта.Я обнаружил, что для тестов в рамках
unittest
или аналогичной среде наиболее эффективным способом безопасного отключения нежелательной регистрации в модульных тестах является включение / отключение вsetUp
/tearDown
методов конкретного тестового примера. Это позволяет одной цели, где журналы должны быть отключены. Вы также можете сделать это явно на регистраторе класса, который вы тестируете.источник
Я использую простой метод декоратор, чтобы отключить ведение журнала только в конкретном методе тестирования.
И тогда я использую это как в следующем примере:
источник
Существует несколько симпатичных и чистых методов для приостановки регистрации в тестах с помощью
unittest.mock.patch
метода.foo.py :
tests.py :
И
python3 -m unittest tests
будет производить вывод журнала.источник
Иногда вы хотите журналы, а иногда нет. У меня есть этот код в моем
settings.py
Поэтому, если вы запустите тест с
--no-logs
опциями, вы получите толькоcritical
логи:Это очень полезно, если вы хотите ускорить тестирование в процессе непрерывной интеграции.
источник
Если вы не хотите, чтобы он повторно включал / выключал его в setUp () и tearDown () для unittest (не вижу причины для этого), вы можете просто сделать это один раз для каждого класса:
источник
В тех случаях, когда я хочу временно отключить определенный регистратор, я написал небольшой менеджер контекста, который мне показался полезным:
Вы тогда используете это как:
Преимущество этого заключается в том, что регистратор повторно включается (или возвращается в прежнее состояние) после
with
завершения.источник
Вы можете поместить это в каталог верхнего уровня для
__init__.py
файла модульных тестов . Это отключит глобальное ведение журнала в модульном тесте.источник
В моем случае у меня есть файл настроек,
settings/test.py
созданный специально для тестирования, вот как это выглядит:Я поместил переменную среды
DJANGO_SETTINGS_MODULE=settings.test
в/etc/environment
.источник
Если у вас есть разные модули инициализации для тестирования, разработки и производства, вы можете отключить что-либо или перенаправить его в инициализаторе. У меня есть local.py, test.py и production.py, которые все наследуются от common.y
common.py выполняет все основные настройки, включая этот фрагмент:
Тогда в test.py у меня есть это:
Это заменяет обработчик консоли FileHandler и означает, что регистрация по-прежнему ведется, но мне не нужно трогать базу производственного кода.
источник
Если вы используете
pytest
:Поскольку pytest перехватывает сообщения журнала и отображает их только для неудачных тестов, обычно не требуется отключать ведение журнала. Вместо этого используйте отдельный
settings.py
файл для тестов (например,test_settings.py
) и добавьте к нему:Это заставляет Django вообще пропустить настройку регистрации.
LOGGING
Настройки будут игнорироваться и могут быть удалены из настроек.При таком подходе вы не получаете никаких журналов для пройденных тестов и получаете все доступные журналы для неудачных тестов.
Тесты будут выполняться с использованием журнала, который был установлен
pytest
. Его можно настроить по своему вкусу вpytest
настройках (например,tox.ini
). Чтобы включить сообщения журнала уровня отладки, используйтеlog_level = DEBUG
(или соответствующий аргумент командной строки).источник