Регистрация в тестах py.test - PullRequest
56 голосов
/ 12 января 2011

Я хотел бы поместить некоторые операторы регистрации в тестовую функцию для проверки некоторых переменных состояния.

У меня есть следующий фрагмент кода:

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 отправлять протоколирование на консоль также из методов тестирования?

Ответы [ 2 ]

41 голосов
/ 01 августа 2018

Начиная с версии 3.3, pytest поддерживает ведение журнала в реальном времени, что означает, что все записи журнала, полученные в тестах, будут немедленно распечатаны на терминале. Эта функция описана в разделе Live Logs . Живая регистрация отключена по умолчанию; чтобы включить его, установите log_cli = 1 в конфигурации pytest.ini. Живая регистрация поддерживает передачу в терминал и файл; соответствующие опции позволяют настраивать записи:

терминал:

  • 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 (или setup.cfg). Все остальные параметры могут быть переданы из командной строки или заданы в файле конфигурации. Как указано Кевин Барре в этом комментарии , переопределение параметров ini из командной строки может быть сделано через опцию -o/--override. Таким образом, вместо объявления log_cli в pytest.ini / setup.cfg, вы можете просто позвонить:

$ pytest -o log_cli=true ...

Примеры * +1057 * Простой тестовый файл, используемый для демонстрации: # 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)

25 голосов
/ 12 января 2011

Работает для меня, вот вывод, который я получаю: [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 о захвате вывода .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...