微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将stdlib日志记录与py.test结合使用

我正在使用py.test来测试我的一些模块,其中包含相当多的stdlib日志记录.我当然喜欢将日志记录到stdout,这是由py.test捕获的,因此如果测试失败,我将获得所有相关的日志消息.

这样做的问题是,在py.test丢弃此对象之后,日志记录模块最终尝试将消息记录到py.test提供的’stdout’对象.也就是说,我得到:

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集成的正确方法

(我试着看看this,它看起来应该没有问题,所以它对我帮助不大)

解决方法:

记录/捕获交互是为了更好地使用即将发布的2.0.1版本,您可以通过以下方式将其作为开发快照安装:

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

之后输入“py.test –version”时,你应该至少得到“2.0.1.dev9”.而你发布的问题/错误现在应该消失了.

一点背景:日志包坚持“拥有”它使用的流,认情况下它抓取sys.stderr并坚持在进程退出关闭它,通过atexit模块注册. py.test用一个临时文件替换sys.stdout以便快照输出(包括文件描述符级别的输出以便也捕获子进程输出).所以py.test进化到非常小心,总是使用相同的临时文件,因为没有日志记录的atexit-code抱怨.

并不是说你也可以安装[pytest-capturelog] [1]插件,这将有助于处理日志输出.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐