如何使用pytest断言NO警告被引发

时间:2017-08-14 09:48:35

标签: python python-3.x unit-testing warnings pytest

我想确保在一个断言中没有任何警告

pytest documentation about warnings中找不到任何明确的答案。

我试过这个,想到也许None意味着“没有”:

def test_AttrStr_parse_warnings():
    """Check _AttrStr.parse() raises proper warnings in proper cases."""
    with pytest.warns(None):
        _AttrStr('').parse()

但是这个断言也总是正确的,例如,即使实际发出警告,测试也不会失败:

def test_AttrStr_parse_warnings():
    """Check _AttrStr.parse() raises proper warnings in proper cases."""
    with pytest.warns(None):
        _AttrStr('').parse()
        warnings.warn('any message')

2 个答案:

答案 0 :(得分:8)

可以“记录”任何可能出现的警告,并使用它来添加另一个断言以确保引发警告的数量为0

def test_AttrStr_parse_warnings():
    """Check parse() raises proper warnings in proper cases."""
    with pytest.warns(None) as record:
        _AttrStr('').parse()
    assert len(record) == 0

为确保其正常工作:在第二个断言中添加warnings.warn('any message'),让测试失败。

答案 1 :(得分:0)

如果您有测试其他功能的测试,但您还想断言没有发出警告,则可以使用装饰器。这是我根据之前接受的来自 zezollo

的答案写的
def no_warnings(func):

    def wrapper_no_warnings(*args, **kwargs):

        with pytest.warns(None) as warnings:
            func(*args, **kwargs)

        if len(warnings) > 0:
            raise AssertionError(
                "Warnings were raised: " + ", ".join([str(w) for w in warnings])
            )

    return wrapper_no_warnings

然后您可以修饰测试类函数以添加此断言。

class MyTestClass(TestCase)

  @no_warnings
  def test_something(self):

      # My important test
      self.assertTrue(True)