Отображение print-вывода в консоли при тестах pytest
Быстрый ответ
Если вы хотите, чтобы информация, выводимая командой print, отображалась в консоли при использовании pytest, используйте ключ -s:
pytest -s your_test_module.py  # Разрашим print работать вовсю!
Такой подход позволяет наблюдать за выводом в реальном времени не уводя ваши настройки тестов.

Анализ механизма отлавливания вывода в pytest
Перехватывание вывода pytest'ом
По умолчанию, во время выполнения тестов pytest перехватывает весь вывод stdout и stderr и отображает его только после тестов, которые завершились ошибкой, это нужно для формирования отчетов без лишнего "шума".
Управление перехватыванием вывода различными путями
Вы можете контролировать настройки перехвата вывода при помощи параметра --capture=method. Существуют следующие методы:
- --capture=sys: Классический перехват в строке Python.
- --capture=fd: Перехватывание на уровне файлового дескриптора.
- --capture=noили- -s: Полное отключение перехватывания.
Фикстуры для управления выводом в pytest
С использованием фикстуры capsys вы можете перехватывать вывод команды print и работать с ним внутри тестов, это дает больше возможностей для анализа.
Отключение перехватывания вывода в определенном куске теста
Можно использовать фикстуру capsys чтобы временно отключить перехватывание вывода:
def test_something(capsys):
    with capsys.disabled():
        print("Теперь вы это увидите в своей консоли!")  # Противостоять pytest бесполезно!
Вывод данных в экстренной ситуации
Непрекомендуется использовать, но в крайней необходимости можно принудительно вызвать вывод всех данных, добавив assert False в код для провала теста и отображения при этом перехваченной информации (если использовать -s нельзя).
Визуализация
Представьте pytest в роли ниндзи 🥷, который бесшумно проходит через ваши тесты, сообщения от него остаются скрытыми до тех пор, пока не включится внешний источник света 🔦.
Включите свет: Запустите pytest с -s или --capture=no.
pytest -s your_test_module.py
И вуаля! Ваш "ниндзи" теперь больше не скрывается и сообщает о каждом своем шаге!
Продвинутое управление выводом и обход блокирования
Использование модуля atexit в Python
Модуль atexit предоставляет возможность выполнять функции в конце работы программы. Это может помочь вывести важные уведомления после тестирования:
import atexit
def farewell_message():
    print("Тестирование завершено! Время побрести на кофе-брейк ☕!")
atexit.register(farewell_message)
Сохранение результатов теста
Вы можете сохранить результаты тестов в файл, чтобы в дальнейшем они были доступны для ознакомления:
pytest --capture=fd --outfile=output.log  # Ход конём – не выводить в консоль, а сохранять результат!
Проверка "тишинолюбивости" pytest
Если вы захотите узнать, не скрылся ли вывод в тишине, стоит провести следующую проверку:
import sys
assert sys.stdout is sys.__stdout__  # Если уже подозреваешь pytest в "тишинолюбивости".
Создание функции отчетности
Если вам нравится порядок, то обязательно определите функцию report() и воспользуйтесь atexit для ее вызова:
import atexit
def report(message):
    print(message)
atexit.register(report, "Тсс... Тестирование завились.")  # Это конечная фраза!
Советы по работе с выводом данных, тишиной и не только
Баланс между детализацией и тишиной
Не стоит злоупотреблять ключом -s, иначе вывод тестов станет беспорядочным. Постоянно поддерживайте уровень громкости ваших тестов.
Работа в среде CI/CD
В системах непрерывного развертывания взаимодействие с выводом данных может отличаться, поэтому использование -s позволит лучше управлять логами в системе непрерывной интеграции.
Отказ от отладки через print
Даже если вы привыкли использовать print для отладки, стоит пересмотреть этот подход и внимательно посмотреть на методы логирования, предлагаемые pytest. Они более структурированы и удобны.
Не прекращайте обучение
Следите за обновлениями (официальной документации pytest), она содержит свежую информацию, полезные рекомендации и подходы.
Полезные материалы
- Документация по перехвату stdout/stderr в pytest — всё о работе с выводом данных в pytest.
- Логирование во время тестов pytest на Stack Overflow — обсуждения и советы по логированию.
- Подробное руководство по использованию pytest от Real Python — глубокий изучение возможностей pytest.
- Управление логами в документации pytest.
- Справочник API pytest — детальная информация о всех настройках.
- Руководство по логированию в Python 3.12.1 — более глубокое понимание системы логирования Python и её использования в pytest.


