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

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

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

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

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

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

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

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

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

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

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

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

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

Вы можете контролировать настройки перехвата вывода при помощи параметра --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.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Как запустить pytest с выводом print в консоли?
1 / 5