1

組み込みの仮説戦略は、関数を介して提供されます (たとえば、実際の戦略ではなく、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())
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 に答える