Регистрация в тестах py.test
Я хотел бы поместить некоторые инструкции регистрации в тестовую функцию для проверки некоторых переменных состояния.
У меня есть следующий фрагмент кода:
import pytest,os
import logging
logging.basicConfig(level=logging.DEBUG)
mylogger = logging.getLogger()
#############################################################################
def setup_module(module):
''' Setup for the entire module '''
mylogger.info('Inside Setup')
# Do the actual setup stuff here
pass
def setup_function(func):
''' Setup for test functions '''
if func == test_one:
mylogger.info(' Hurray !!')
def test_one():
''' Test One '''
mylogger.info('Inside Test 1')
#assert 0 == 1
pass
def test_two():
''' Test Two '''
mylogger.info('Inside Test 2')
pass
if __name__ == '__main__':
mylogger.info(' About to start the tests ')
pytest.main(args=[os.path.abspath(__file__)])
mylogger.info(' Done executing the tests ')
Я получаю следующий вывод:
[bmaryada-mbp:/Users/bmaryada/dev/platform/main/proto/tests/tpch $]python minitest.py
INFO:root: About to start the tests
======================================================== test session starts =========================================================
platform darwin -- Python 2.6.2 -- pytest-2.0.0
collected 2 items
minitest.py ..
====================================================== 2 passed in 0.01 seconds ======================================================
INFO:root: Done executing the tests
Обратите внимание, что на консоль передаются только сообщения журнала из блока '__name__ == __main__'
.
Есть ли способ заставить pytest испускать ведение журнала для консоли из методов тестирования?
Ответы
Ответ 1
У меня работает, вот вывод, который я получаю: [snip → пример был неверным]
Изменение: Кажется, что вы должны передать опцию -s
в py.test, чтобы он не захватывал стандартный вывод. Здесь (py.test не установлен) было достаточно использовать python pytest.py -s pyt.py
.
Для вашего кода все, что вам нужно, это передать -s
в args
в main
:
pytest.main(args=['-s', os.path.abspath(__file__)])
См. документацию по py.test о захвате вывода.
Ответ 2
Начиная с версии 3.3, pytest
поддерживает ведение журнала в реальном времени, что означает, что все записи журнала, отправленные в тестах, будут немедленно распечатаны на терминале. Эта функция описана в разделе Live Logs. Живая регистрация отключена по умолчанию; чтобы включить его, установите log_cli = 1
в конфигурации pytest.ini
1. Живая регистрация поддерживает передачу в терминал и файл; соответствующие параметры позволяют настраивать записи:
Терминал:
log_cli_level
log_cli_format
log_cli_date_format
file:
log_file
log_file_level
log_file_format
log_file_date_format
Примечание: флаг log_cli
нельзя передать из командной строки, и должен быть установлен в pytest.ini
. Все остальные параметры могут быть переданы из командной строки или заданы в файле конфигурации. Как отметил Кевин Барре в этом комментарии, переопределение параметров ini из командной строки может быть сделано через опцию -o/--override
. Поэтому вместо объявления log_cli
в pytest.ini
вы можете просто позвонить:
$ pytest -o log_cli=true ...
Примеры
Простой тестовый файл, используемый для демонстрации:
# test_spam.py
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
, чтобы избежать ошибок.