Как я могу объединить ведение журнала stdlib с py.test - PullRequest
6 голосов
/ 18 января 2011

Я использую py.test для тестирования некоторых моих модулей, которые содержат довольно много записей в stdlib.Я, конечно, хотел бы, чтобы протоколирование регистрировалось в stdout, который захватывается py.test, чтобы я получал все соответствующие сообщения регистрации, если тест не пройден.

Проблема заключается в том, что модуль журналирования в конечном итоге пытается записывать сообщения в объект 'stdout', предоставленный py.test после , когда этот объект был удален py.test.То есть я получаю:

Traceback (most recent call last):
  File "/usr/lib/python2.6/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib/python2.6/logging/__init__.py", line 1508, in shutdown
    h.flush()
  File "/usr/lib/python2.6/logging/__init__.py", line 754, in flush
    self.stream.flush()
ValueError: I/O operation on closed file

Если я отключаю захват с помощью -s, у меня не возникает никаких проблем, но, конечно, это делает тестовый вывод нечитаемым с ненужной регистрацией.

Может кто-нибудь сказать мне, как правильно интегрировать ведение журнала stdlib с py.test?

(я пытался посмотреть этот , где, похоже, он должен работать без проблем, так чтомне мало помогло)

Ответы [ 3 ]

6 голосов
/ 22 января 2011

Взаимодействие при ведении журнала / захвате должно улучшать работу с предстоящим выпуском 2.0.1, который вы можете установить уже в виде моментального снимка разработки:

pip install -i http://pypi.testrun.org pytest 

Вы должны получить по крайней мере «2.0.1.dev9», когда будете вводить «py.test --version» впоследствии. И проблема / ошибка, которую вы опубликовали, теперь должны исчезнуть.

Немного предыстории: пакет ведения журнала настаивает на "владении" потоками, которые он использует, и по умолчанию он захватывает sys.stderr и настаивает на том, чтобы закрыть его при выходе из процесса, зарегистрированном через модуль atexit. py.test заменяет sys.stdout временным файлом для вывода снимка (включая вывод на уровне дескриптора файла, чтобы также перехватить вывод подпроцесса). Таким образом, py.test стал очень осторожным, чтобы всегда использовать один и тот же временный файл, чтобы не жаловаться на atexit-код логирования.

Не то, чтобы вы также могли установить плагин [pytest-capturelog] [1], который поможет вам еще немного разобраться с выходом журнала.

[1] http://pypi.python.org/pypi/pytest-capturelog/0.7

3 голосов
/ 21 января 2011

Если вы не возражаете против того, чтобы регистрация никуда не делась после удаления объектов py.test, вы можете установить переменную уровня модуля logging.raiseExceptions в False где-то в начале ваших модулей или тестов.1004 * Это заставит модуль ведения журнала глотать исключения, возникающие в подсистеме ведения журнала.(Это также хорошая практика для производственных систем, где вы не хотите, чтобы ошибки в журналах приводили к сбоям в вашей системе) *

Вы также можете использовать logging.basicConfig(), чтобы настроить вывод журнала в отдельный файл.Но это, вероятно, не то, что вы хотите.

0 голосов
/ 18 января 2011

Все, что вам нужно сделать, это передать параметр -s в py.test, чтобы он не захватывал стандартный вывод.

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