使用 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 块中的断言为 Falseexcept 路径将被执行,特定的测试用例将被执行被忽略。也就是说,每个真正的测试失败(由 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=1min_value=0.00000001 以防止 0