gpt4 book ai didi

python - 有没有办法只执行文档测试,而忽略打印函数调用?

转载 作者:行者123 更新时间:2023-11-28 21:15:45 24 4
gpt4 key购买 nike

假设地说,我的函数返回一个值并且有很多打印语句(可能有 100 个或更多)。

有没有办法运行doctest这样就可以忽略/跳过所有其他打印工作(我熟悉 +SKIP 指令,它用于跳过 doctest 示例),即当我执行我的函数时(或将我的模块作为脚本运行)使用 doctests:

python mymodule.py

或者:

python -m doctest mymodule.py

我应该得到:

  • 没有,如果成功的话;或
  • 错误消息,以防任何测试示例失败;

除此之外别无其他。运行 doctest 不应该给我一个终端窗口,其中包含那些 print 函数调用的输出/文本。

请不要建议使用单元测试(例如 unittest ),因为它会扼杀问题的本质。

最佳答案

doctest 使用 stdout stderr,来显示来自任何失败测试的消息。因此,您不能像最初建议的那样修补 stdout - 这将抑制您的 print 调用 来自 doctest 的任何消息>.


一种选择是使用附加的verbose 参数定义print 的函数,这样您就可以在必要时抑制它。

def foo(verbose=True):
"""Does whatever.

>>> foo(verbose=False)

"""
if verbose:
print('Hello world')

虽然您必须更改功能,但这也为您在不测试时提供了有用的选项。


另一种方法是为使用它的函数显式提供适当的 print 函数,允许您在运行时传递 NOOP:

def bar(print=print):
"""Does whatever.

>>> bar(print=lambda *args, **kwargs: None)

"""
print('Hello world')

这还需要更改函数定义,但至少可以避免更改这些函数的主体


第三种选择是为整个被测模块打补丁 print,例如:

def baz():
"""Does whatever.

>>> baz()

"""
print('Hello world')

if __name__ == '__main__':

import doctest

print = lambda *args, **kwargs: None

doctest.testmod()

请注意,这也会影响 doctest 看到的输出,因此您不要在文档字符串中包含任何 print 输出(我认为这是个好消息!) 但它不适用于 python -m doctest mymodule.py

关于python - 有没有办法只执行文档测试,而忽略打印函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29696944/

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