2017-09-21 2 views
0

J'ai 3 fichiers, module.py qui contient un exemple de fonction qui teste si une entrée est numérique. J'ai un fichier appelé test_mymodule_long.py qui avec succès les tests et passe plusieurs types d'entrées en utilisant py.test et hypothesis. J'utilise Python 3.6, mais cela ne devrait pas avoir d'importance (si ce n'est pas le cas, il suffit de supprimer l'indication de type). Pour cette fonction particulière, cela ne m'aide pas de les séparer; Si l'hypothèse trouve un cas limite, je veux juste connaître l'entrée incriminée et l'exception soulevée. Ainsi, je voudrais écrire ce test comme indiqué dans test_mymodule_short.py, mais cela ne fonctionne pas.En utilisant l'hypothèse et py.test pour tester les stratégies composées en python, dois-je les tester une à la fois?

Ma question est la suivante: existe-t-il un moyen d'écrire des stratégies dans l'hypothèse plus efficacement que dans test_mymodule_long.py?

Voici le code dans chaque fichier:

''' 
mymodule.py 
''' 

from typing import Union 

Number = Union[int, float] 


def is_numeric(x: Number): 
    try: 
     y = float(x) 
     return True 
    except: 
     return False 

# ------------------------------------------- 

''' 
test_mymodule_long.py [This code works] 
(using pytest to discover tests automatically) 
''' 
from hypothesis import given, example 
import hypothesis.strategies as st 
import mymodule 

@given(st.integers()) 
def test_is_numeric_integer(num): 
    result = stats.is_numeric(num) 
    assert isinstance(result, bool) 


@given(st.floats()) 
def test_is_numeric_float(num): 
    result = stats.is_numeric(num) 
    assert isinstance(result, bool) 


@given(st.text()) 
def test_is_numeric_text(num): 
    result = stats.is_numeric(num) 
    assert isinstance(result, bool) 


@given(st.lists(st.floats())) 
def test_is_numeric_list(num): 
    result = stats.is_numeric(num) 
    assert isinstance(result, bool) 

# ------------------------------------------- 

''' 
test_mymodule_short.py [This code fails!] 
(using pytest to discover tests automatically) 
''' 
from hypothesis import given, example 
import hypothesis.strategies as st 
import mymodule 

@given(st.integers()) 
@given(st.floats()) 
@given(st.text()) 
@given(st.lists(st.floats())) 
def test_is_numeric_list(num): 
    result = mymodule.is_numeric(num) 
    assert isinstance(result, bool) 

Notez que je ne pense pas que le message d'erreur est vraiment important ici, il est plus d'un -ce-faire-isnt-vous do- situation et je cherche des conseils sur la façon compacte de tester une fonction avec des stratégies d'hypothèses multiples. En outre, je sais qu'une fonction is_numeric appropriée serait programmée différemment (en supposant que vous ayez vraiment besoin d'une telle fonction). Je sais aussi que les tests indiqués ici ne seraient pas suffisamment complets pour savoir si cela a fonctionné. Ce ne sont que des exemples pour clarifier ma question.

Répondre

0

Il est impossible d'utiliser plusieurs stratégies pour un seul test, mais peut combiner plusieurs stratégies en une seule et l'utiliser dans vos tests - la stratégie one_of. Donc, vous pourriez écrire quelque chose comme ce qui suit:

from hypothesis import given, example 
import hypothesis.strategies as st 
import mymodule 

@given(st.one_of(
    st.integers(), 
    st.floats(), 
    st.text(), 
    st.lists(st.floats()), 
)) 
def test_is_numeric_list(num): 
    result = mymodule.is_numeric(num) 
    assert isinstance(result, bool)