【问题标题】:How can I combine stdlib logging with py.test如何将 stdlib 日志记录与 py.test 结合使用
【发布时间】:2011-06-11 01:57:10
【问题描述】:

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

问题在于日志模块最终会尝试将消息记录到 py.test 提供的“stdout”对象中该对象已被 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 集成的正确方法?

(我尝试查看this,看起来它应该可以正常工作,所以对我没有多大帮助)

【问题讨论】:

  • 你能告诉我们你是如何运行你的 py.test 代码的吗?如果发生这种情况,则必须在 py.test 之前配置和初始化日志记录,但如果您通过 py.test 可执行文件运行代码,则不会发生这种情况。
  • 我使用基本命令行py.test 运行它,让它随心所欲地收集和运行。

标签: python unit-testing logging pytest


【解决方案1】:

记录/捕获交互是为了更好地与即将发布的 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

【讨论】:

  • 新版本运行良好,谢谢。我无法让您的 pip ... 命令工作,但手动安装了软件包。
  • 很高兴它成功了。是不是“点子”丢失了?否则,添加“-U”可能有助于确保它会升级。或者使用“easy_install”作为具有相同选项的替代工具。
  • 我安装了 pip。没有按规定工作。尝试了easy_install,有点困惑。所以我只是手动下载了 py 和 pytest 的 zipfiles 并使用 easy_install 安装它们。
  • 刚刚尝试过:“easy_install pip”然后“pip install --upgrade -i pypi.testrun.orgpytest”。它安装了 2.0.1.dev10,报告的问题已修复 :-)
【解决方案2】:

如果您不介意在 py.test 丢弃对象后日志无处可去,您可以在模块或测试的早期将模块级变量 logging.raiseExceptions 设置为 False

这将使日志模块吞下日志子系统中发生的异常。 (对于生产系统来说,这也是一个很好的做法,您不希望在记录系统崩溃时出现错误)

您还可以使用logging.basicConfig() 将日志记录输出设置为单独的文件。但这可能不是你想要的。

【讨论】:

    【解决方案3】:

    您需要做的就是将-s 选项传递给py.test,这样它就不会捕获标准输出。

    【讨论】:

    • “如果我用 -s 关闭捕获,我没有任何问题,但当然这会使测试输出无法读取无关日志记录。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多