gpt4 book ai didi

python - 使用 doctest 测试警告

转载 作者:太空狗 更新时间:2023-10-29 20:24:47 25 4
gpt4 key购买 nike

我想使用 doctests测试某些警告的存在。例如,假设我有以下模块:

from warnings import warn

class Foo(object):
"""
Instantiating Foo always gives a warning:

>>> foo = Foo()
testdocs.py:14: UserWarning: Boo!
warn("Boo!", UserWarning)
>>>
"""

def __init__(self):
warn("Boo!", UserWarning)

如果我运行 python -m doctest testdocs.py 以在我的类中运行 doctest 并确保打印警告,我得到:

testdocs.py:14: UserWarning: Boo!
warn("Boo!", UserWarning)
**********************************************************************
File "testdocs.py", line 7, in testdocs.Foo
Failed example:
foo = Foo()
Expected:
testdocs.py:14: UserWarning: Boo!
warn("Boo!", UserWarning)
Got nothing
**********************************************************************
1 items had failures:
1 of 1 in testdocs.Foo
***Test Failed*** 1 failures.

看起来警告正在打印,但没有被 doctest 捕获或注意到。我猜这是因为警告被打印到 sys.stderr 而不是 sys.stdout。但即使我在模块末尾说 sys.stderr = sys.stdout 也会发生这种情况。

那么有什么方法可以使用doctests来测试警告吗?我在文档或我的 Google 搜索中找不到这种或那种方式的提及。

最佳答案

Testing Warnings Python 文档的某些部分专门讨论这个主题。但是,总而言之,您有两个选择:

(A) 使用catch_warnings上下文管理器

这是官方文档中的推荐类(class)。但是,catch_warnings 上下文管理器仅在 Python 2.6 中出现。

import warnings

def fxn():
warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
# Cause all warnings to always be triggered.
warnings.simplefilter("always")
# Trigger a warning.
fxn()
# Verify some things
assert len(w) == 1
assert issubclass(w[-1].category, DeprecationWarning)
assert "deprecated" in str(w[-1].message)

(B) 将警告升级为错误

如果之前没有看到警告——因此在警告注册表中注册了——那么您可以设置警告以引发异常并捕获它。

import warnings


def fxn():
warnings.warn("deprecated", DeprecationWarning)


if __name__ == '__main__':
warnings.simplefilter("error", DeprecationWarning)

try:
fxn()
except DeprecationWarning:
print "Pass"
else:
print "Fail"
finally:
warnings.simplefilter("default", DeprecationWarning)

关于python - 使用 doctest 测试警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2418570/

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