Python 假设:如何断言测试函数中的错误

问题描述

我刚刚开始使用假设进行测试生成。使用假设时如何允许测试函数中出现某些错误

简单的例子是一个除法函数,它适用于大于 0 的整数:

def divide(a: int,b: int) -> float:
    return a/b

当我在没有明确排除 0 的情况下编写假设检验时,我当然会出错:

from hypothesis import given,strategies as st

@given(a=st.integers(),b=st.integers())
def test_divide(a,b):
    assert isinstance(divide(a,b),float)

由于假设使用整数 0,所以我得到 ZeroDivisionError

---------------------------
Falsifying example: test_divide(
    a=0,b=0,)
============================
Failed test.py::test_divide - ZeroDivisionError: division by zero

这当然是意料之中的,在这个简单的例子中,我可以简单地排除 0,因为我知道错误会发生。在其他函数中,尤其是处理字符串的函数中,很难排除所有我知道会抛出错误的东西。在许多情况下,虽然错误是可以的,例如在字符串函数中使用空字节时。

是否有可能以某种方式“允许”某些类型的错误

或者我是否必须重新考虑在使用假设时如何编写测试?

解决方法

如果我理解正确,这就是你要找的

def divide(a: int,b: int) -> float:
    try:
        return a/b
    except ZeroDivisionError:
        return # the value you want to return for this scenario
,

这里不是专家,但根据我对假设的修改,我认为跳过此类已知错误的首选方法是使用 assume

from hypothesis import assume,given,strategies as st

@given(a=st.integers(),b=st.integers())
def test_divide(a,b):
    assume(b != 0)
    assert isinstance(divide(a,b),float)