web-dev-qa-db-fra.com

Comment désactiver un test avec py.test?

Dis que j'ai un tas de tests:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Y at-il un décorateur ou quelque chose de similaire que je pourrais ajouter aux fonctions pour empêcher py.test d’exécuter ce test? Le résultat pourrait ressembler à quelque chose comme ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

J'ai cherché quelque chose comme ça dans la documentation py.test, mais je pense que quelque chose me manque.

52
ericmjl

Pytest a les décorateurs skip et skipif, similaires au module Python unittest (qui utilise skip et skipIf), que vous pouvez trouver dans la documentation - ici .

Des exemples du lien peuvent être trouvés ici:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

Le premier exemple ignore toujours le test, le deuxième exemple vous permet d'ignorer conditionnellement les tests (ce qui est très utile lorsque les tests dépendent de la plate-forme, de la version de l'exécutable ou de bibliothèques optionnelles.

Par exemple, si je veux vérifier si quelqu'un a la bibliothèque pandas installée pour un test).

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...
78
Alexander Huszagh

Le skip décorateur ferait le travail:

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

(l'argument reason est facultatif, mais il est toujours utile de spécifier pourquoi un test est ignoré).

Il existe également skipif() qui permet de désactiver un test si une condition spécifique est remplie.


Ces décorateurs peuvent être appliqués à des méthodes, des fonctions ou des classes.

Pour ignorer tous les tests d'un module , définissez une variable globale pytestmark:

# test_module.py
pytestmark = pytest.mark.skipif(...)
16
alecxe

Je ne sais pas si c'est amorti, mais vous pouvez aussi utiliser le pytest.skip fonction dans un test:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3
4
Wayne Werner

Vous pouvez également vouloir exécuter le test même si vous pensez que ce test échouera. Pour un tel scénario https://docs.pytest.org/fr/latest/skipping.html suggère d'utiliser le décorateur @ pytest.mark.xfail

@pytest.mark.xfail
def test_function():
    ...

Dans ce cas, Pytest continuera à exécuter votre test et vous laissera maintenant s'il passe ou maintenant, mais ne se plaindra pas et ne cassera pas la construction.

4
Ruben Gasparian