【问题标题】:Python hypothesis: How to assert errors in test functionPython 假设:如何断言测试函数中的错误
【发布时间】:2021-06-16 10:56:07
【问题描述】:

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

简单的例子是一个除法函数,它适用于大于 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,因为我知道错误会发生。在其他函数中,尤其是那些使用字符串的函数中,很难排除所有我知道会引发错误的东西。在许多情况下,尽管错误是可以的,例如在字符串函数中使用空字节时。

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

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

【问题讨论】:

  • 只需从除数策略中排除零,例如b=st.integers().filter(bool)
  • 并使用b=st.just(0)在不同的测试用例中单独测试零

标签: python python-hypothesis


【解决方案1】:

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

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

【讨论】:

  • 我不想返回任何东西,我认为ZeroDivisionError 在这里还可以。我想在测试函数中断言一个值或一个特定的错误。该示例有些构造,因为您可以在没有 0 的情况下进行测试并编写第二个断言正确错误的测试。不过对于其他类型/功能来说更难。
  • 您可以使用pass,而不是return。更好的是,使用with contextlib.suppress(ZeroDivisionError):
【解决方案2】:

这里不是专家,但根据我对假设的修补,我认为跳过这类已知错误的首选方法是使用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)

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 2011-03-25
    • 1970-01-01
    • 2016-07-08
    • 2018-02-20
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2015-03-02
    相关资源
    最近更新 更多