#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 достигнет функции, и то, что я делаю в этой функции, на самом деле больше не имеет значения.