我想确保在一个断言中没有任何警告。
在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')
答案 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)