Как прекратить входить в юнит-тесты Django от печати до stderr? - PullRequest
5 голосов
/ 10 января 2012

Я тестирую некоторые модели Django с помощью bog-standerd django.test.Testcase.Мой models.py записывает в журнал отладки, используя следующий код инициализации:

import logging
logger = logging.getLogger(__name__) # name is myapp.models

, а затем я записываю в журнал:

logger.debug("Here is my message")

В моем settings.py янастроил один FileHandler и регистратор для myapp, используя этот обработчик и только этот обработчик.Это замечательно.Я вижу сообщения в этот журнал.Когда я нахожусь в оболочке Django, я только вижу сообщения в этот журнал.

Когда я, однако, запускаю свой набор тестов, моя консоль набора тестов также видит все эти сообщения.Он использует другой форматер, который я не определил явно, и пишет в stderr.У меня не определен обработчик журнала, который пишет в stderr.

Я не хочу, чтобы эти сообщения рассылали спам на моей консоли.Я запишу свой лог-файл, если хочу увидеть эти сообщенияЕсть ли способ остановить это?(Да, я мог бы перенаправить stderr, но полезный вывод также идет в stderr.)

Редактировать: я установил два обработчика в своих настройках.py:

'handlers': {
    'null': {
        'level': 'DEBUG',
        'class': 'django.utils.log.NullHandler',
    },
    'logfile' : {
        'level':'DEBUG',
        'class':'logging.FileHandler',
        'filename':'%s/log/development.log' % PROJECT_DIR,
        'formatter': 'simple'
    },
},

и попробовалthis:

'loggers': {
    'django': {
        'level': 'DEBUG',
        'handlers': ['null']
    },
    'myapp': {
        'handlers': ['logfile'],
        'level':'DEBUG',
    },

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

1 Ответ

3 голосов
/ 11 января 2012

Из вашего фрагмента конфигурации неясно, какие обработчики, если таковые имеются, настроены для корневого регистратора.(Я также предполагаю, что вы используете Django 1.3.) Можете ли вы исследовать и сообщить нам, какие обработчики были добавлены в корневой логгер при выполнении тестов?AFAICT Django ничего не добавляет - возможно, какой-то импортируемый вами код делает вызов basicConfig без вашего осознания этого.Используйте что-то вроде ack-grep для поиска любых вхождений fileConfig, dictConfig, basicConfig и addHandler - все это может быть добавлением обработчика к корневому логгеру.

Еще одна вещь, которую нужно попробовать: установить флаг распространения наЛожь для всех регистраторов верхнего уровня (например, «django», но также и тех, которые используются вашими модулями - скажем, «myapp»).Это что-то меняет?

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