问题描述
使用hypothesis
库针对程序代码中的断言进行基于属性的测试时,什么是最佳实践?
我创建了一个非常简单的函数来说明我的观点。该函数简单地将两个数字相除。我提出一个断言,如果分母为零,该断言将失败。
运行测试时,由于断言错误,hypothesis
为参数0
(分母)选择b
作为参数from hypothesis import given
from hypothesis import strategies as st
def divide(a: float,b: float) -> float:
assert b != 0,"Denominator must not be zero!"
return a / b
@given(b=st.floats())
def test_divide(b):
assert isinstance(divide(100,b),(int,float))
时,测试失败。但是,该函数中的断言旨在处理这种特殊情况。
b=0
我应该如何调整代码以使参数值@given(b=st.floats())
def test_divide(b):
try:
assert isinstance(divide(100,float))
except AssertionError:
assume(False)
通过测试?什么是pythonic方式?
编辑:
我认为,建议的重复问题(Exception handling and testing with pytest and hypothesis)不能解决问题。
如果我使用以下代码会怎样?
try
据我了解,一旦False
块中的断言为except
,将执行hypothesis
-path并将忽略特定的测试用例。也就是说,所有实际的测试失败(由divide
发现)都将被忽略。
与建议的重复问题相比,我的AssertionError
函数将为ZeroDivisionError
抛出b=0
而不是AssertionError
。其他所有失败的测试用例也会导致try
({{1}}块)。
解决方法
@given(b=st.floats())
def test_divide(b):
assume(b != 0)
assert isinstance(divide(100,b),(int,float))
假设告诉假设b == 0
是一个不好的例子,而忽略它。
请记住,使用浮动策略,您还将获得Nan
和-Nan
-您可以使用allow_infinity=False
在策略中禁用它。修改策略后,还可以添加min_value=1
或min_value=0.00000001
以防止0