Pytest caplog работает с пользовательским регистратором при создании с помощью приспособления, но не при создании непосредственно в методе тестирования

#python #logging #pytest #caplog

Вопрос:

Я тестировал свои пользовательские регистраторы с помощью Pytest. Создал пользовательский регистратор из конфигурационного файла Yaml и написал следующий тест:

 @pytest.fixture(scope="module")
def logger():
    """Fixture for providing a configured logger object"""
    logging_config = yaml.safe_load(config_yaml)
    logging.config.dictConfig(logging_config)
    return logging.getLogger("test_logger")


def test_logger_emits_with_queue_handler(logger, caplog):
    """Test fails if queue handler could not emit logs"""
    logger.info("This is a test")
    assert "This is a test" in caplog.text
 

Это работает, и тест проходит, как и ожидалось.

Однако, когда я пытаюсь обойтись без светильников, тест завершается неудачей:

 def test_logger_emits_with_queue_handler(caplog):
    """Test fails if queue handler could not emit logs"""
    logging_config = yaml.safe_load(config_yaml)
    logging.config.dictConfig(logging_config)
    logger = logging.getLogger("test_logger")
    logger.info("This is a test")
    assert "This is a test" in caplog.text
 

Для справки, мой конфигурационный файл yaml, пользовательский обработчик очереди, взят из моей библиотеки журналов:

 version: 1
objects:
  queue:
    class: queue.Queue
    maxsize: 1000
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    formatter: simple
    stream: ext://sys.stdout
  queue_handler:
    class: logging_.handlers.QueueListenerHandler
    handlers:
      - cfg://handlers.console
    queue: cfg://objects.queue
loggers:
  test_logger:
    level: DEBUG
    handlers:
      - queue_handler
    propagate: yes
root:
  level: NOTSET
  handlers:
    - console
 

Я пытаюсь понять причину этого. Связано ли это с тем, что стандартный объект регистратора уже был настроен к моменту загрузки Pytest и запуска метода тестирования? Есть ли обходной путь для этого без написания приспособления?

Комментарии:

1. Просто любопытно. Если вы используете контекстный менеджер и устанавливаете соответствующий уровень, имеет ли это какое-либо значение? т. е. with caplog.at_level(logging.DEBUG): не обоснованное предположение, просто знайте, что это работает для меня без специального регистратора.

2. @Эван, я думаю, что пробовал это, но в данном случае это не сработало. Мое (также не очень образованное) предположение состоит в том, что регистратор уже инициализируется до того, как pytest достигнет функции, и то, что я делаю в этой функции, на самом деле больше не имеет значения.