Как запретить тестам django показывать сообщения sys.stdout?

Моя проблема в том, что, поскольку я добавил ведение журнала в свое приложение django, когда я запускаю свои модульные тесты, все мои сообщения журнала отображаются в консоли. Я использую нос в качестве тестового бегуна. Его обычное поведение заключалось в том, чтобы захватить sys.stdout, показать вывод консоли только в случае неудачного теста и показать его в конце.

Раньше у меня был этот вывод при запуске моих тестов:

........
Ran 8 tests in 0.876s

OK
Destroying test database for alias 'default'...

Это вывод, который я получаю сейчас, когда запускаю python manage.py test accounts:

...log message
.log message
....log message
Ran 8 tests in 1.034s

OK
Destroying test database for alias 'default'...

Это начало происходить, когда я добавил в свой код ведение журнала с использованием стандартной библиотеки ведения журнала Python. Я поменял свои settings.py и views.py. Ниже вы можете проверить, что именно я изменил.

Может ли кто-нибудь помочь мне сохранить ведение журнала, но избежать раздражающего дополнительного вывода при запуске тестов?

Добавлено в settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'INFO',
            'stream': sys.stdout,
        },
    },
    'loggers': {
        '': {
            'handlers': ['console'],
            'level': 'INFO',
            'propagate': False,
        },
    },
}

Добавлено в мои представления

import logging

logger = logging.getLogger(__name__)

logger.info("log message")

Команда, которую django использует для запуска моих тестов

nosetests accounts/ --with-coverage --cover-package=accounts,keys, utils --cover-html --cover-erase --logging-filter='selenium' --verbosity=1

Конфигурация носового тестового бегуна в settings.py (то же самое было, когда он работал)

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
NOSE_ARGS = [
    '--with-coverage',
    '--cover-package=accounts,keys, utils',
    '--cover-html',
    '--cover-erase',
    "--logging-filter='selenium'",
]

person Alvaro Aguilar    schedule 14.06.2018    source источник
comment
Я думаю, что это может быть ваш --logging-filter вам нужно включить журналы селена?   -  person Stefan Collier    schedule 14.06.2018
comment
Я не уверен, что понимаю, что вы имеете в виду. Вы хотите добавить что-то еще в мой лог-фильтр? Можете объяснить, что именно и как вы будете делать? Спасибо!!   -  person Alvaro Aguilar    schedule 14.06.2018


Ответы (1)


Вы должны написать собственный тестовый бегун, чтобы отключить ведение журнала или изменить уровень.

import logging

from django_nose import NoseTestSuiteRunner


class DisableLoggingNoseTestSuiteRunner(NoseTestSuiteRunner):
    """
    Disable the test runner log level below `logging.CRITICAL`.
    """
    def run_tests(self, *args, **kwargs):
        # Disable logging below critical
        logging.disable(logging.CRITICAL)
        super(DisableLoggingNoseTestSuiteRunner, self).run_tests(*args, **kwargs)

Вы также должны изменить свой settings.py, чтобы использовать этот тестовый бегун.

TEST_RUNNER = 'package_where_you_place_it.DisableLoggingNoseTestSuiteRunner'
person jackotonye    schedule 14.06.2018