Отображение print-вывода в консоли при тестах pytest

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вы хотите, чтобы информация, выводимая командой print, отображалась в консоли при использовании pytest, используйте ключ -s:

Python
Скопировать код
pytest -s your_test_module.py  # Разрашим print работать вовсю!

Такой подход позволяет наблюдать за выводом в реальном времени не уводя ваши настройки тестов.

Кинга Идем в IT: пошаговый план для смены профессии

Анализ механизма отлавливания вывода в pytest

Перехватывание вывода pytest'ом

По умолчанию, во время выполнения тестов pytest перехватывает весь вывод stdout и stderr и отображает его только после тестов, которые завершились ошибкой, это нужно для формирования отчетов без лишнего "шума".

Управление перехватыванием вывода различными путями

Вы можете контролировать настройки перехвата вывода при помощи параметра --capture=method. Существуют следующие методы:

  • --capture=sys: Классический перехват в строке Python.
  • --capture=fd: Перехватывание на уровне файлового дескриптора.
  • --capture=no или -s: Полное отключение перехватывания.

Фикстуры для управления выводом в pytest

С использованием фикстуры capsys вы можете перехватывать вывод команды print и работать с ним внутри тестов, это дает больше возможностей для анализа.

Отключение перехватывания вывода в определенном куске теста

Можно использовать фикстуру capsys чтобы временно отключить перехватывание вывода:

Python
Скопировать код
def test_something(capsys):
    with capsys.disabled():
        print("Теперь вы это увидите в своей консоли!")  # Противостоять pytest бесполезно!

Вывод данных в экстренной ситуации

Непрекомендуется использовать, но в крайней необходимости можно принудительно вызвать вывод всех данных, добавив assert False в код для провала теста и отображения при этом перехваченной информации (если использовать -s нельзя).

Визуализация

Представьте pytest в роли ниндзи 🥷, который бесшумно проходит через ваши тесты, сообщения от него остаются скрытыми до тех пор, пока не включится внешний источник света 🔦.

Включите свет: Запустите pytest с -s или --capture=no.

Markdown
Скопировать код
pytest -s your_test_module.py

И вуаля! Ваш "ниндзи" теперь больше не скрывается и сообщает о каждом своем шаге!

Продвинутое управление выводом и обход блокирования

Использование модуля atexit в Python

Модуль atexit предоставляет возможность выполнять функции в конце работы программы. Это может помочь вывести важные уведомления после тестирования:

Python
Скопировать код
import atexit

def farewell_message():
    print("Тестирование завершено! Время побрести на кофе-брейк ☕!")

atexit.register(farewell_message)

Сохранение результатов теста

Вы можете сохранить результаты тестов в файл, чтобы в дальнейшем они были доступны для ознакомления:

Python
Скопировать код
pytest --capture=fd --outfile=output.log  # Ход конём – не выводить в консоль, а сохранять результат!

Проверка "тишинолюбивости" pytest

Если вы захотите узнать, не скрылся ли вывод в тишине, стоит провести следующую проверку:

Python
Скопировать код
import sys
assert sys.stdout is sys.__stdout__  # Если уже подозреваешь pytest в "тишинолюбивости".

Создание функции отчетности

Если вам нравится порядок, то обязательно определите функцию report() и воспользуйтесь atexit для ее вызова:

Python
Скопировать код
import atexit

def report(message):
    print(message)

atexit.register(report, "Тсс... Тестирование завились.")  # Это конечная фраза!

Советы по работе с выводом данных, тишиной и не только

Баланс между детализацией и тишиной

Не стоит злоупотреблять ключом -s, иначе вывод тестов станет беспорядочным. Постоянно поддерживайте уровень громкости ваших тестов.

Работа в среде CI/CD

В системах непрерывного развертывания взаимодействие с выводом данных может отличаться, поэтому использование -s позволит лучше управлять логами в системе непрерывной интеграции.

Отказ от отладки через print

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

Не прекращайте обучение

Следите за обновлениями (официальной документации pytest), она содержит свежую информацию, полезные рекомендации и подходы.

Полезные материалы

  1. Документация по перехвату stdout/stderr в pytest — всё о работе с выводом данных в pytest.
  2. Логирование во время тестов pytest на Stack Overflow — обсуждения и советы по логированию.
  3. Подробное руководство по использованию pytest от Real Python — глубокий изучение возможностей pytest.
  4. Управление логами в документации pytest.
  5. Справочник API pytest — детальная информация о всех настройках.
  6. Руководство по логированию в Python 3.12.1 — более глубокое понимание системы логирования Python и её использования в pytest.