Python 为什么我的简单、有限的假设检验从未停止过?

Python 为什么我的简单、有限的假设检验从未停止过?,python,pytest,python-hypothesis,Python,Pytest,Python Hypothesis,我正在运行一个带有假设-4.24.6和pytest-5.0.0的测试套件。我的测试有一组有限的可能输入,但假设永远无法完成测试 我将其简化为以下最小的示例,以pytest.py 来自给定的假设导入 导入假设。策略为st @给定(x=st.just(0) |圣胡斯特(1), y=st.just(0) |圣胡斯特(1) |圣约翰(2)) def测试_x_y(x,y): 断言正确 我希望它在这里尝试所有六种组合,然后成功。或者可能是它的一个小倍数来检查片状。相反,它无限期地运行(在大约15分钟的测试

我正在运行一个带有假设-4.24.6和pytest-5.0.0的测试套件。我的测试有一组有限的可能输入,但假设永远无法完成测试

我将其简化为以下最小的示例,以
pytest.py

来自给定的假设导入
导入假设。策略为st
@给定(x=st.just(0)
|圣胡斯特(1),
y=st.just(0)
|圣胡斯特(1)
|圣约翰(2))
def测试_x_y(x,y):
断言正确
我希望它在这里尝试所有六种组合,然后成功。或者可能是它的一个小倍数来检查片状。相反,它无限期地运行(在大约15分钟的测试后,我杀死了它)

如果我中断测试,回溯似乎显示它只是不断生成新的示例


我做错了什么?

这似乎与成功测试的数量有关<代码>假设试图产生:

>>> from hypothesis import given, strategies as st
>>> @given(st.integers(0,1), st.integers(0,2))
... def test(x, y):
...   print(x, y)
...   assert True
... 
>>> test()
0 0
1 1
1 0
1 2
1 1
0 1
0 0
1 2
0 2
0 2
1 0
1 2
0 1
0 1
1 2
[snip…]
请参见,成功测试用例的默认数量应为100。因此,试图生成越来越多的数据,仅限于6个案例,很快就无法找到这6个案例中的一个

最简单的方法可以是仅需要此测试即可通过:

>>> from hypothesis import settings
>>> @settings(max_examples=30)
... @given(st.integers(0,1), st.integers(0,2))
... def test(x, y):
...   print(x, y)
...   assert True
... 
>>> test()
0 0
1 1
1 0
0 2
1 2
0 1
0 1
1 1
1 0
1 1
0 1
1 2
1 1
0 0
0 2
0 2
0 0
1 2
1 0
0 1
1 0
1 0
0 1
1 2
1 1
0 2
0 0
1 2
0 0
0 2

另一种方法是,考虑到测试用例的数量很少,可以使用
假设将它们全部显化,并要求
进行以下操作:



还要注意的是
st.just(0)| st.just(1)
相当于
st.one_(st.just(0),st.just(1))
,所以选择一种方法并坚持下去,但不要把它们混在一起。

这个错误在假设4.26.2中修复了,或者至少我们这么认为;实际上,它在4.26.3中已经修复:

这显然是4.10版本首次出现的回归。对于版本4.9,测试在0.12秒内通过,而对于版本4.10及更高版本,测试不会在>1分钟内停止。我会创建一个程序,或者传唤并询问他。我仍在研究这个问题,但这显然是一个bug!以后的详细信息将发布在“感谢最后的提示”,我已经使示例更简单了。这个问题似乎是一个bug tho,因为它实际上按照4.9中的预期工作,只是尝试了一下:它似乎还不适用于我的示例。我将为github问题添加详细信息。感谢您的跟进-结果是我们修复了一个掩蔽错误,并且需要第二次修复您的实际问题。但据我所知,现在已经修好了!
>>> from hypothesis import given, example, settings, Phase, strategies as st
>>> @settings(phases=(Phase.explicit,))
... @given(x=st.integers(), y=st.integers())
... @example(x=0, y=0)
... @example(x=0, y=1)
... @example(x=0, y=2)
... @example(x=1, y=0)
... @example(x=1, y=1)
... @example(x=1, y=2)
... def test(x, y):
...   print(x, y)
...   assert True
... 
>>> test()
0 0
0 1
0 2
1 0
1 1
1 2