使用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

我应该如何调整代码以使参数值@given(b=st.floats()) def test_divide(b): try: assert isinstance(divide(100,float)) except AssertionError: assume(False) 通过测试?什么是pythonic方式?

编辑:
我认为,建议的重复问题(Exception handling and testing with pytest and hypothesis)不能解决问题。

如果我使用以下代码会怎样?

try

据我了解,一旦False块中的断言为except,将执行hypothesis-path并将忽略特定的测试用例。也就是说,所有实际的测试失败(由divide发现)都将被忽略。

与建议的重复问题相比,我的AssertionError函数将为ZeroDivisionError抛出b=0而不是AssertionError。其他所有失败的测试用例也会导致try({{1}}块)。

解决方法

@given(b=st.floats())
def test_divide(b):
    assume(b != 0)
    assert isinstance(divide(100,b),(int,float))

假设告诉假设b == 0是一个不好的例子,而忽略它。

请记住,使用浮动策略,您还将获得Nan-Nan-您可以使用allow_infinity=False在策略中禁用它。修改策略后,还可以添加min_value=1min_value=0.00000001以防止0

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...