Используйте caplog в приспособлении автоматического использования в pytest

Я хотел бы обернуть все свои тесты приспособлением, в котором журналы, зарегистрированные с помощью 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 -библиотека. Однако это тоже не работает. На самом деле речь идет о том, что я хочу проверить журналы в приборе после фактического теста, но я предполагаю, что захваченные журналы очищаются после теста и до окончания теста.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для этого вы можете использовать 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

Это также не фиксирует журналы. Я использую loguru для регистрации. Я отредактирую свой вопрос.

lefli 04.04.2024 15:56

Вместо этого попробуйте contextlib.redirect_stderr(buf)

sultan 04.04.2024 16:05

Спасибо за ваше время! Уже пробовал. Не работает.

lefli 04.04.2024 16:33

Круто, круто, что ты решил свою проблему 👍!

sultan 04.04.2024 21:49
Ответ принят как подходящий

Ответ я нашла с помощью этого поста.

Во-первых, поскольку 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

Другие вопросы по теме

Похожие вопросы

Преобразование в столбец с плавающей запятой, строковый столбец pandas со смешанными тысячными и десятичными разделителями
Групповой/кластерный полярный фрейм данных по подстроке в строке или строке в подстроке
Python 3: TypeError: невозможно создать экземпляр абстрактного класса BaseConnection с помощью абстрактного метода create_connection
Оптимизация файлов Python
Как отобразить поле uuid моего сериализатора в виде строки в запросе на получение с помощью django restframework
Как запустить асинхронную функцию из другого потока в python-telegram-bot (PTB)
Python cryptography.x509: проверка сертификата x509, сгенерированного модулем Python x509, подписанного центром сертификации (а не корнем), завершается неудачно
Идентификация 4-связных точечных рисунков в сетке 3D-точек с шумом
Как я могу проверить, действителен ли ключ API Google Gemini или нет?
Красивое предупреждение об устаревании с комбинацией мультиполигона и многоугольника, как решить