Отображение 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.