我应该实例化多个测试使用的假设策略吗?

Should I instantiate Hypothesis strategies that are used by multiple tests?

内置的假设策略是通过函数提供的(例如,integers 不是一个实际的策略,而是一个创建策略的函数)。这向我表明策略对象具有内部状态。

@given(integers())
def test_foo(n):
    assert n > 0    
@given(integers())
def test_bar(n):
    assert n < 100

在上面的两个虚假测试中,每个测试都得到一个不同的策略对象(来自 integers 的不同调用。如果我然后像这样创建自己的策略:

positive_integers = integers().filter(lambda x: x > 0)

...然后将其用于相同的测试:

@given(positive_integers)
def test_foo(n):
    assert n > 0    
@given(positive_integers)
def test_bar(n):
    assert n < 100

它们共享相同的策略对象。在我看来这可能是错误的,但在某些情况下 examples in the docs 就是这样做的(参见 NodeStrategyNodeSet 的定义)。我是否应该通过将策略组合包装在一个函数中来避免这种情况:

 positive_integers = lambda: integers().filter(lambda x: x > 0)
 #...
 @given(positive_integers())

我看了一下 source code,看起来跨测试共享同一个策略对象应该没问题。好像你调用了一个函数,所以你可以为策略传递不同的参数。

我认为这意味着您可以这样做:

@given(integers(min_value=0))
def test_foo(n):
    assert n > 0    
@given(integers(min_value=0))
def test_bar(n):
    assert n < 100

或者这个:

positive_integers = integers(min_value=0)

@given(positive_integers)
def test_foo(n):
    assert n > 0    
@given(positive_integers)
def test_bar(n):
    assert n < 100

我看不到任何超出范围边界的状态证据。实际上,BoundedIntStrategy 好像是得到了作为参数传入的搜索数据:

def do_draw(self, data):
    return d.integer_range(data, self.start, self.end)

然而,我只玩了一点假设,所以我肯定是错的。