内置假设策略是通过函数提供的(例如,而不是实际策略,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在某些情况下这样做(参见NodeStrategy
和NodeSet
的定义)。我应该通过将策略组合包装在如下函数中来避免这种情况:
positive_integers = lambda: integers().filter(lambda x: x > 0)
#...
@given(positive_integers())
答案 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)
但是,我只假设了一些假设,所以我当然错了。