1

内置假设策略是通过函数提供的(例如,不是实际策略,而是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

它们共享相同的策略对象。在我看来,这听起来可能是错误的,但在某些情况下,文档中的示例就是NodeStrategy这样做的(参见和的定义NodeSet)。我是否应该通过将策略组合包装在如下函数中来避免这种情况:

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

1 回答 1

2

我查看了源代码,看起来您应该可以在测试之间共享相同的策略对象。似乎您调用了一个函数,因此您可以为策略传递不同的参数。

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

@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)

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

于 2016-12-10T06:58:07.733 回答