組み込みの仮説戦略は、関数を介して提供されます (たとえば、実際の戦略ではなく、integers
戦略を作成する関数です)。これは、戦略オブジェクトには内部状態があることを示唆しています。
@given(integers())
def test_foo(n):
assert n > 0
@given(integers())
def test_bar(n):
assert n < 100
上記の 2 つの偽のテストでは、各テストは (の異なる呼び出しから) 異なる戦略オブジェクトを取得します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())