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

时间:2016-12-09 10:22:39

标签: python unit-testing hypothesis-test

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

1 个答案:

答案 0 :(得分:2)

我看了一下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)

但是,我只假设了一些假设,所以我当然错了。