2016-12-09 2 views
0

Les stratégies d'hypothèses intégrées sont fournies via des fonctions (par exemple, plutôt qu'une stratégie réelle, integers est une fonction qui crée une stratégie). Cela me suggère que les objets de la stratégie ont un état interne.Dois-je instancier des stratégies d'hypothèses utilisées par plusieurs tests?

@given(integers()) 
def test_foo(n): 
    assert n > 0  
@given(integers()) 
def test_bar(n): 
    assert n < 100 

Dans les deux tests faux ci-dessus, chaque test obtient un objet de stratégie différente (de différentes invocations de integers Si je puis créer ma propre stratégie comme ceci:.

positive_integers = integers().filter(lambda x: x > 0) 

... utilisez pour les mêmes tests.

@given(positive_integers) 
def test_foo(n): 
    assert n > 0  
@given(positive_integers) 
def test_bar(n): 
    assert n < 100 

Ils partagent le même objet stratégie Cela me semble que cela pourrait être mal, mais c'est la façon dont le examples in the docs le faire en s quelques cas (voir la définition de NodeStrategy et NodeSet). Dois-je éviter cela en enveloppant la composition de stratégie dans une fonction comme:

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

Répondre

1

J'ai regardé à la source code, et il semble que vous devriez être bien partager le même objet de stratégie à travers des tests. Il semble que vous appelez une fonction pour pouvoir passer différents paramètres pour la stratégie.

Je pense que cela signifie que vous pourriez faire soit ceci:

@given(integers(min_value=0)) 
def test_foo(n): 
    assert n > 0  
@given(integers(min_value=0)) 
def test_bar(n): 
    assert n < 100 

ou ceci:

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 

Je ne pouvais voir aucune preuve d'Etat au-delà des limites de la gamme. En fait, le BoundedIntStrategy semble obtenir les données de recherche passées en paramètre:

def do_draw(self, data): 
    return d.integer_range(data, self.start, self.end) 

Cependant, je n'ai joué un peu avec Hypothesis, donc je pourrais certainement me tromper.