如何使用Python的unittest测试是否已抛出警告?

2024-05-18 20:14:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中有一个下面的函数,我想用unittest测试,如果函数的参数为0,它就会抛出一个警告。我已经试过assertraise了,但是因为我没有发出警告,所以这不起作用。

def isZero(i):
    if i != 0:
        print "OK"
    else:
        warning = Warning("the input is 0!") 
        print warning
    return i

Tags: the函数警告input参数ifdefok
3条回答

您可以使用catch_warnings上下文管理器。实际上,这允许您模拟警告处理程序,以便可以验证警告的详细信息。请参阅official docs以获得更完整的解释和示例测试代码。

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)

从Python 3.2开始,您可以简单地使用^{}方法。

with self.assertWarns(Warning):
    do_something()

您可以编写自己的assertWarns函数来增加catch_warnings上下文。我刚刚用一个mixin实现了它:

class WarningTestMixin(object):
    'A test which checks if the specified warning was raised'

    def assertWarns(self, warning, callable, *args, **kwds):
        with warnings.catch_warnings(record=True) as warning_list:
            warnings.simplefilter('always')

            result = callable(*args, **kwds)

            self.assertTrue(any(item.category == warning for item in warning_list))

用法示例:

class SomeTest(WarningTestMixin, TestCase):
    'Your testcase'

    def test_something(self):
        self.assertWarns(
            UserWarning,
            your_function_which_issues_a_warning,
            5, 10, 'john', # args
            foo='bar'      # kwargs
        )

如果your_function发出的警告中至少有一个是UserWarning类型,则测试将通过。

相关问题 更多 >

    热门问题