使用 doctest 并登录 python 程序

2024-04-23


#!/usr/bin/python2.4
import logging
import sys
import doctest
def foo(x):
        """
    >>> foo (0)
    0
        """
        print ("%d" %(x))
        _logger.debug("%d" %(x))
def _test():
        doctest.testmod()
_logger = logging.getLogger()
_logger.setLevel(logging.DEBUG)
_formatter = logging.Formatter('%(message)s')
_handler = logging.StreamHandler(sys.stdout)
_handler.setFormatter(_formatter)
_logger.addHandler(_handler)
_test()

我想对我的所有打印语句使用记录器模块。我已经查看了前 50 个顶级谷歌链接,他们似乎同意 doctest 使用它自己的标准输出副本。 如果使用 print ,则它可以工作;如果使用 logger,则它会记录到根控制台。 有人可以演示一个带有代码片段的工作示例,以便我进行组合。 请注意,运行鼻子来测试 doctest 只会在测试结束时附加日志输出(假设您设置了开关),它不会将它们视为打印语句。


在您的文档测试中,在需要任何日志记录捕获之前,执行以下操作addHandler(logging.Streamhandler(sys.stdout))在你的记录器上。

例如, 假设logger是你的日志记录对象:

"""
This is a doctest that will capture output from the logging module.

>>> logger.addHandler(logging.StreamHandler(sys.stdout))

The rest of your doctest, now able to use output from the logging
module...
"""

解释:正如您所说,“doctest 使用它自己的标准输出副本”。它通过欺骗来做到这一点sys.stdout: 设定了sys.stdout to DocTestRunner._fakeout。一旦 doctest 运行,doctest 的欺骗就到位了,所以sys.stdout现在设置为DocTestRunner._fakeout。如果您创建一个logging.StreamHandler对于 sys.stdout 此时,sys.stdout 将指向 doctest 对 sys.stdout 的欺骗,而不是真正的 sys.stdout,因此您现在为 doctest 的欺骗而不是真正的 sys.stdout 添加 StreamHandler,使 doctest 看到您的记录的输出。

该解决方案还有一个优点,不依赖于doctest中的内部私有变量,例如_fakeout or _SpoofOut,以防将来发生变化。

Gotchas: 如果你得到

error: [Errno 128] Transport endpoint is not connected

你可能忘记了import sys.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 doctest 并登录 python 程序 的相关文章

随机推荐