使用 python 假设处理 assertions/exceptions
Handling assertions/exceptions using python-hypothesis
当涉及到使用 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
的测试通过?什么是 pythonic 方式?
编辑:
在我看来,建议的重复问题 () 没有解决问题。
如果我使用以下代码会怎样?
@given(b=st.floats())
def test_divide(b):
try:
assert isinstance(divide(100, b), (int, float))
except AssertionError:
assume(False)
据我所知,一旦 try
块中的断言为 False
,except
路径将被执行,特定的测试用例将被执行被忽略。也就是说,每个真正的测试失败(由 hypothesis
发现)都将被忽略。
与建议的重复问题相比,我的 divide
函数将抛出 AssertionError
而不是 ZeroDivisionError
b=0
。每个其他失败的测试用例也会导致 AssertionError
(try
-block).
@given(b=st.floats())
def test_divide(b):
assume(b != 0)
assert isinstance(divide(100, b), (int, float))
assume 告诉假设 b == 0
是一个坏的例子,并忽略它。
请记住,使用浮动策略,您还将获得 Nan
和 -Nan
- 您可以在策略中使用 allow_infinity=False
禁用它。修改战略后,您还可以添加 min_value=1
或 min_value=0.00000001
以防止 0
当涉及到使用 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
的测试通过?什么是 pythonic 方式?
编辑:
在我看来,建议的重复问题 (
如果我使用以下代码会怎样?
@given(b=st.floats())
def test_divide(b):
try:
assert isinstance(divide(100, b), (int, float))
except AssertionError:
assume(False)
据我所知,一旦 try
块中的断言为 False
,except
路径将被执行,特定的测试用例将被执行被忽略。也就是说,每个真正的测试失败(由 hypothesis
发现)都将被忽略。
与建议的重复问题相比,我的 divide
函数将抛出 AssertionError
而不是 ZeroDivisionError
b=0
。每个其他失败的测试用例也会导致 AssertionError
(try
-block).
@given(b=st.floats())
def test_divide(b):
assume(b != 0)
assert isinstance(divide(100, b), (int, float))
assume 告诉假设 b == 0
是一个坏的例子,并忽略它。
请记住,使用浮动策略,您还将获得 Nan
和 -Nan
- 您可以在策略中使用 allow_infinity=False
禁用它。修改战略后,您还可以添加 min_value=1
或 min_value=0.00000001
以防止 0