Логирование (logging) в pytest

Pytest в Python: эффективное логирование

Логирование — важный аспект любой системы или приложения. Это позволяет отслеживать и анализировать действия, происходящие в вашем коде. В контексте тестирования это становится особенно важным, так как можно отследить, какие именно шаги или операции были выполнены до возникновения ошибки.

В Python для логирования существует встроенный модуль logging. pytest умеет работать с этим модулем, делая логи доступными при проведении тестов.

Базовое логирование

Для начала, вам нужно будет настроить логирование в вашем коде или тесте:

import logging

def function_that_logs():
    logging.warning("Это предупреждение!")
    logging.error("Это ошибка!")

Как видеть смотреть в pytest

По умолчанию, при выполнении pytest логи не отображаются. Чтобы увидеть их, используйте флаг -l или --log-cli-level.

pytest --log-cli-level=INFO

Это покажет все логи уровня INFO и выше (WARNING, ERROR и т. д.).

Дополнительные настройки логирования

pytest также позволяет настроить форматирование логов и их местоположение. Например, чтобы записать логи в файл, вы можете использовать:

pytest --log-file=logfile.txt

А для настройки формата:

pytest --log-cli-format="%(asctime)s - %(levelname)s - %(message)s"

Уровни логирования

pytest позволяет устанавливать разные уровни логирования для разных модулей:

pytest --log-cli-level=INFO --log-cli-level=tests.my_module=DEBUG

Таким образом, основной уровень логирования будет INFO, но для модуля tests.my_module будет использоваться уровень DEBUG.

Захват логов во время выполнения теста

pytest захватывает логи во время выполнения каждого теста. Это позволяет вам видеть логи только для конкретных тестов, что может быть очень полезно при диагностике проблемы:

def test_log_captured():
    logging.info("Это сообщение будет захвачено и отображено только при ошибке в этом тесте.")

Если этот тест проходит, вы не увидите сообщение. Однако если тест завершится неудачей, pytest покажет все захваченные логи, что помогает понять контекст ошибки.

Отключение захвата логов

Иногда захват логов может мешать, особенно если вы используете логирование для дебаггинга во время разработки. Вы можете отключить захват логов с помощью флага --no-log-capture:

pytest --no-log-capture

Журналирование в пользовательских фикстурах

Используя логирование в своих фикстурах, вы можете легко отслеживать их выполнение и возможные проблемы:

import pytest

@pytest.fixture
def my_fixture():
    logging.info("Начало выполнения фикстуры")
    yield
    logging.info("Конец выполнения фикстуры")

Это позволит видеть, когда начинается и завершается каждая фикстура.

Интеграция с другими инструментами логирования

Помимо стандартного модуля logging, существуют и другие популярные инструменты логирования, такие как Loguru или Sentry. pytest обычно хорошо интегрируется с этими инструментами, и вы можете использовать их возможности вместе с возможностями логирования pytest.

Заключение

Логирование является ценным инструментом не только для отладки, но и для понимания происходящих в системе процессов. Комбинируя мощь pytest с продвинутыми инструментами логирования, разработчики могут значительно повысить качество своего кода и упростить процесс нахождения и исправления ошибок.

Содержание: