Начиная с версии 3.3, pytest
поддерживается ведение журнала в реальном времени, что означает, что все записи журнала, созданные в ходе тестов, будут немедленно распечатаны на терминале. Эта функция задокументирована в разделе Live Logs . Живое ведение журнала по умолчанию отключено; чтобы включить его, установите log_cli = 1
в pytest.ini
конфиге 1 . Живое ведение журнала поддерживает отправку в терминал и в файл; соответствующие параметры позволяют настраивать записи:
Терминал:
log_cli_level
log_cli_format
log_cli_date_format
файл:
log_file
log_file_level
log_file_format
log_file_date_format
Примечание : log_cli
флаг не может быть передан из командной строки и должен быть установлен pytest.ini
. Все остальные параметры могут быть переданы из командной строки или установлены в файле конфигурации. Как указал Кевин Барре в этом комментарии , переопределение параметров ini из командной строки можно выполнить с помощью -o/--override
параметра. Поэтому вместо объявления log_cli
in pytest.ini
вы можете просто позвонить:
$ pytest -o log_cli=true ...
Примеры
Простой тестовый файл, используемый для демонстрации:
import logging
LOGGER = logging.getLogger(__name__)
def test_eggs():
LOGGER.info('eggs info')
LOGGER.warning('eggs warning')
LOGGER.error('eggs error')
LOGGER.critical('eggs critical')
assert True
Как видите, никаких дополнительных настроек не требуется; pytest
автоматически настроит регистратор на основе параметров, указанных в pytest.ini
командной строке или переданных из нее.
Живая запись на терминал, INFO
уровень, необычный вывод
Конфигурация в pytest.ini
:
[pytest]
log_cli = 1
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_cli_date_format=%Y-%m-%d %H:%M:%S
Запуск теста:
$ pytest test_spam.py
=============================== test session starts ================================
platform darwin -- Python 3.6.4, pytest-3.7.0, py-1.5.3, pluggy-0.7.1 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-4673373, inifile: pytest.ini
collected 1 item
test_spam.py::test_eggs
---------------------------------- live log call -----------------------------------
2018-08-01 14:33:20 [ INFO] eggs info (test_spam.py:7)
2018-08-01 14:33:20 [ WARNING] eggs warning (test_spam.py:8)
2018-08-01 14:33:20 [ ERROR] eggs error (test_spam.py:9)
2018-08-01 14:33:20 [CRITICAL] eggs critical (test_spam.py:10)
PASSED [100%]
============================= 1 passed in 0.01 seconds =============================
Живая запись в терминал и файл, только сообщение и CRITICAL
уровень в терминале, необычный вывод в pytest.log
файл
Конфигурация в pytest.ini
:
[pytest]
log_cli = 1
log_cli_level = CRITICAL
log_cli_format = %(message)s
log_file = pytest.log
log_file_level = DEBUG
log_file_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_file_date_format=%Y-%m-%d %H:%M:%S
Тестовый забег:
$ pytest test_spam.py
=============================== test session starts ================================
platform darwin -- Python 3.6.4, pytest-3.7.0, py-1.5.3, pluggy-0.7.1 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-4673373, inifile: pytest.ini
collected 1 item
test_spam.py::test_eggs
---------------------------------- live log call -----------------------------------
eggs critical
PASSED [100%]
============================= 1 passed in 0.01 seconds =============================
$ cat pytest.log
2018-08-01 14:38:09 [ INFO] eggs info (test_spam.py:7)
2018-08-01 14:38:09 [ WARNING] eggs warning (test_spam.py:8)
2018-08-01 14:38:09 [ ERROR] eggs error (test_spam.py:9)
2018-08-01 14:38:09 [CRITICAL] eggs critical (test_spam.py:10)
1 Хотя можно настроить pytest
в setup.cfg
соответствии с [tool:pytest]
раздела, не поддавайтесь искушению сделать это , если вы хотите обеспечить собственный формат живого журнала. Другие инструменты чтения setup.cfg
могут рассматривать такие вещи как %(message)s
интерполяцию строк и завершаться ошибкой. Используйте, pytest.ini
чтобы избежать ошибок.