如何将标准库logging与py.test结合使用?

9 浏览
0 Comments

如何将标准库logging与py.test结合使用?

我正在使用py.test来测试一些包含大量stdlib日志记录的模块。当然,我希望日志记录到stdout,这样就可以通过py.test捕获,并在测试失败时获取所有相关的日志消息。\n问题是,在py.test丢弃了stdout对象后,日志模块仍然试图将消息记录到py.test提供的\'stdout\'对象。因此,我得到了以下错误:\n

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

\n如果我使用-s关闭捕获,就没有任何问题,但是这样会使测试输出变得难以阅读,因为包含了不相关的日志。\n有人能告诉我如何正确地将stdlib日志与py.test集成吗?\n(我尝试过查看此处,看起来应该可以无问题地工作,但对我来说没有什么帮助)

0
0 Comments

问题出现原因:当使用py.test运行测试时,如果不使用-s选项,py.test会自动捕获stdout,这会导致与stdlib logging的输出冲突。

解决方法:只需在运行py.test时加上-s选项,这样py.test就不会捕获stdout,从而避免与stdlib logging的冲突。然而,这样做会导致测试输出难以阅读,因为与无关的logging混在一起。

文章如下:

问题:如何将stdlib logging与py.test结合使用?

当使用py.test运行测试时,如果不使用-s选项,py.test会自动捕获stdout。然而,这会导致与stdlib logging的输出冲突。解决这个问题的方法很简单,只需在运行py.test时加上-s选项,这样py.test就不会捕获stdout,从而避免与stdlib logging的冲突。然而,这样做会导致测试输出难以阅读,因为与无关的logging混在一起。

解决方法如下:

在运行py.test时,加上-s选项,如下所示:

$ py.test -s

这样,py.test就不会捕获stdout,从而避免与stdlib logging的冲突。但是,这样做会导致测试输出难以阅读,因为与无关的logging混在一起。

0
0 Comments

问题的原因是在使用 py.test 运行测试时,无法将标准库 logging 与 py.test 结合使用。解决方法是可以在模块或测试的早期设置模块级变量 logging.raiseExceptions 为 False,这样可以使 logging 模块吞掉在日志子系统中发生的异常。另外一种解决方法是使用 logging.basicConfig() 将日志输出到一个单独的文件中。但这可能不是你想要的。

0
0 Comments

问题的原因是在2.0.1版本中,logging包坚持“拥有”它使用的流,并且默认情况下它会占用sys.stderr并在进程退出时关闭它,这是通过atexit模块注册的。而py.test会用一个临时文件替换sys.stdout以便快照输出(包括文件描述符级别的输出,以便也能捕获子进程的输出)。因此,py.test必须非常小心地始终使用同一个临时文件,以避免logging的atexit代码投诉。

解决方法是安装2.0.1版本,并且安装pytest-capturelog插件来处理日志输出。安装命令为pip install -i http://pypi.testrun.org pytest,然后在命令行中输入py.test --version来检查是否成功安装。如果安装失败,可以尝试添加-U参数来确保升级,或者使用easy_install作为替代工具。

以上是一个用户在解决问题后的反馈,他尝试了pip install --upgrade -i http://pypi.testrun.org pytest命令来安装2.0.1版本,并且问题得到了解决。

0