157 votes

Comment désactiver un test à l'aide de py.test?

Disons que j'ai un tas de tests:

 def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...
 

Existe-t-il un décorateur ou quelque chose de similaire que je pourrais ajouter aux fonctions pour empêcher py.test d'exécuter uniquement 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 les documents py.test, mais je pense qu'il me manque peut-être quelque chose ici.

236voto

Alexander Huszagh Points 6661

Pytest a l'ignorer et skipif décorateurs, semblable à l'Python module unittest (qui utilise skip et skipIf), qui peut être trouvé dans la documentation ici.

Exemples à partir du lien peut être trouvé 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 toujours pas de test, le deuxième exemple permet de conditionnellement sauter des tests (grande lorsque les tests dépendent de la plate-forme, version exécutable, ou en option les bibliothèques.

Par exemple, si je veux vérifier si quelqu'un a la bibliothèque, les pandas installé 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():
    ...

32voto

alecxe Points 50783

L' skip décorateur pour faire le travail:

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

(reason argument est facultatif, mais il est toujours une bonne idée de préciser pourquoi un test est ignorée).

Il est également skipif() qui permet de désactiver un test si une des conditions est remplie.


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

Pour passer tous les tests dans un module, définir une pytestmark variable:

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

14voto

Wayne Werner Points 10172

Je ne sais pas s'il est déprécié, mais vous pouvez également utiliser la fonction pytest.skip l'intérieur d'un test:

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

9voto

Ruben Gasparian Points 71

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/en/latest/skipping.html suggère d'utiliser le décorateur @ pytest.mark.xfail

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

Dans ce cas, Pytest exécutera toujours votre test et vous laissera maintenant s'il réussit ou maintenant, mais ne se plaindra pas et ne cassera pas la construction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X