Я хотел бы обернуть все свои тесты приспособлением, в котором журналы, зарегистрированные с помощью loguru, проверяются на наличие сообщений об ошибках.
Я попробовал это:
@pytest.fixture(autouse=True)
def assert_no_log_error(caplog):
yield
assert "ERROR" not in caplog.text
Но caplog.text всегда пуст. Я предполагаю, что caplog очищается после теста и до того, как прибор фактически проверит журналы. Как я могу заставить это работать?
РЕДАКТИРОВАТЬ 1: Я нашел пример использования журналов loguru с фикстурами pytest в документации loguru: https://loguru.readthedocs.io/en/stable/resources/migration.html#replacing-caplog-fixture-from-pytest -библиотека. Однако это тоже не работает. На самом деле речь идет о том, что я хочу проверить журналы в приборе после фактического теста, но я предполагаю, что захваченные журналы очищаются после теста и до окончания теста.
Для этого вы можете использовать io и contextlib
@pytest.fixture(autouse=True)
def assert_no_log_error():
with io.StringIO() as buf, contextlib.redirect_stderr(buf):
yield
value = buf.getvalue()
buf.truncate()
assert "ERROR" not in value
Вместо этого попробуйте contextlib.redirect_stderr(buf)
Спасибо за ваше время! Уже пробовал. Не работает.
Круто, круто, что ты решил свою проблему 👍!
Ответ я нашла с помощью этого поста.
Во-первых, поскольку pytest использует стандартный модуль ведения журналов Python, журналы из loguru должны записываться правильно. Это можно сделать с помощью модуля pytest-loguru , согласно документации loguru.
Установите pytest-loguru с помощью: pip install pytest-loguru
Тогда приспособление можно записать так:
import logging
from _pytest.logging import LogCaptureFixture
@pytest.fixture(autouse=True)
def assert_no_log_error(caplog: LogCaptureFixture):
yield
for record in caplog.get_records('call'):
assert record.levelno < logging.ERROR
Это также не фиксирует журналы. Я использую loguru для регистрации. Я отредактирую свой вопрос.