gpt4 book ai didi

python - 如何使用 doctest 进行日志记录?

转载 作者:行者123 更新时间:2023-12-02 07:08:04 25 4
gpt4 key购买 nike

以下文档测试失败:

import logging
logging.basicConfig(level=logging.DEBUG,format='%(message)s')

def say_hello():
'''
>>> say_hello()
Hello!
'''
logging.info('Hello!')

if __name__ == '__main__':
import doctest
doctest.testmod()

这些页面

似乎建议 logging.StreamHandler(sys.stdout)logger.addHandler(handler) 但我的尝试在这方面失败了。 (我是 python 新手,如果不是很明显的话。)

请帮我修复上面的代码,以便测试通过。

<小时/>

2017 年 6 月 4 日更新: 回答 00prometheus ' 评论:已接受的答案 use doctest and logging in python program当我问这个问题时,似乎不必要地复杂。确实如此,因为这里接受的答案给出了一个更简单的解决方案。在我高度偏见的观点中,我的问题也比我在原始帖子中链接的问题更清楚。

最佳答案

您需要定义一个“logger”对象。这通常在导入后完成:

import sys
import logging
log = logging.getLogger(__name__)

当您想要记录消息时:

log.info('Hello!')

在像脚本一样运行的代码中,您设置 basicConfig:

if __name__ == '__main__':
import doctest
logging.basicConfig(level=logging.DEBUG, stream=sys.stdout, format='%(message)s')
doctest.testmod()

编辑:

好吧,你是对的。它不起作用,但我让它起作用......但不要这样做!只需使用打印语句或返回您实际需要检查的内容。正如您的第二个链接所说,这只是一个坏主意。您不应该检查日志输出(用于日志记录)。甚至第二个链接的原始发布者也表示,他们通过将日志记录切换为使用打印来使其正常工作。但这是似乎有效的邪恶代码:

class MyDocTestRunner(doctest.DocTestRunner):
def run(self, test, compileflags=None, out=None, clear_globs=True):
if out is None:
handler = None
else:
handler = logging.StreamHandler(self._fakeout)
out = sys.stdout.write
logger = logging.getLogger() # root logger (say)
if handler:
logger.addHandler(handler)
try:
doctest.DocTestRunner.run(self, test, compileflags, out, clear_globs)
finally:
if handler:
logger.removeHandler(handler)
handler.close()

if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG, format='%(message)s')
tests = doctest.DocTestFinder().find(say_hello, __name__)
dt_runner = MyDocTestRunner()
for t in tests:
dt_runner.run(t, out=True)

编辑(续):

在尝试您的第二个链接建议的内容时,我的尝试也失败了。这是因为 doctest 在内部将 sys.stdout 重新分配给 self._fakeout。这就是为什么除了我的黑客之外什么都行不通。我实际上告诉记录器写入这个“fakeout”。

编辑(评论答案):

这并不完全是链接中的代码。如果它是链接中的代码,我会说这并不是一个糟糕的选择,因为它没有做任何太复杂的事情。然而,我的代码使用的是普通用户不应使用的“私有(private)”内部实例属性。这就是为什么它是邪恶的。

是的,日志记录可用于测试输出,但在单元测试/文档测试中这样做没有多大意义,这可能就是为什么文档测试不包含这样的开箱即用的功能。您链接到的 TextTest 内容都是关于功能或集成测试的。单元测试(和文档测试)应该测试小的单独组件。如果您必须捕获记录的输出以确保您的单元测试/文档测试正确,那么您可能应该考虑将事物分开或不在文档测试中进行这些检查。

我个人只使用 doctests 来进行简单的示例和验证。主要用于使用示例,因为任何用户都可以看到内联文档测试。

编辑(确定最后一个):

相同的解决方案,更简单的代码。此代码不需要您创建自定义运行程序。您仍然需要创建默认的运行程序和其他内容,因为您需要访问“_fakeout”属性。如果不以流的形式记录到此属性,则无法使用 doctest 检查记录输出。

if __name__ == '__main__':
dt_runner = doctest.DocTestRunner()
tests = doctest.DocTestFinder().find(sys.modules[__name__])
logging.basicConfig(level=logging.DEBUG, format='%(message)s', stream=dt_runner._fakeout)
for t in tests:
dt_runner.run(t)

关于python - 如何使用 doctest 进行日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22300869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com