问题描述
我刚刚开始使用假设进行测试生成。使用假设时如何允许测试函数中出现某些错误?
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)