Как проверить обработчик, используемый для записи журнала?


Я пишу функциональные тесты для моего приложения Python. Я использую стандартный пакет ведения журнала Python в тестируемом коде. В моих модульных тестах я высмеял пакет ведения журнала, но для функциональных тестов я хотел бы проверить 2 вещи:

  1. журналы в правильном формате - этот я могу проверить в порядке -
  2. журналы отправляются в stdout-вот где я немного потерялся -

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

with assertLogs('', level='INFO') as captured_logs:
    do_something()
    assertEqual(captured_logs.records[0].msg, "expected message")

Это работает нормально, но я только тестирую свою точку зрения 1, журналы создаются и сообщения, как и ожидалось.

Мой вопрос заключается в том, как я могу проверить, что эти журналы действительно отправляются в stdout, а не в файл или stderr и т. д.?

Редактировать:

Примером кода для тестирования может быть

import logging    

def do_something():
    logging.warning("expected message")

Результатом тестирования этого кода будет то, что тест проходит, потому что сообщение, записанное в журнал, является ожидаемым. Но это пройдет независимо от того, если журнал переходит в файл, либо в sys.stdout, либо в sys.stderr... Мой вопрос будет заключаться в том, что мне нужно добавить в тестовый код, чтобы убедиться, что тест проходит только тогда, когда сообщение журнала отправляется в stdout

Спасибо!!

1 3

1 ответ:

Вы проверяете обработчики корневого регистратора, чтобы убедиться, что StreamHandler (который является обработчиком, входящим в консоль) является его единственным регистратором.

Например:

from logging import getLogger, StreamHandler

root_logger = getLogger('')
assert len(root_logger.handlers) == 1
assert isinstance(root_logger.handlers[0], StreamHandler)