#!/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(使用前将#替换为@)