108 votes

Comment contrôler l'ordre d'exécution des cas de test dans pytest ?

J'ai deux fichiers dans un répertoire. Dans l'un des fichiers, il y a un cas de test de longue durée qui génère une certaine sortie. Dans l'autre fichier, il y a un cas de test qui lit cette sortie.

Comment puis-je garantir l'ordre d'exécution correct des deux cas de test? Y a-t-il une autre alternative que de mettre les cas de test dans le même fichier dans le bon ordre?

6voto

Sergey Pleshakov Points 121

Il est important de garder à l'esprit, en essayant de résoudre le "problème" d'ordre de pytest, que l'exécution des tests dans le même ordre que celui spécifié semble être le comportement par défaut de pytest.

Il s'avère que mes tests étaient hors de cet ordre à cause d'un de ces packages - pytest-dependency, pytest-depends, pytest-order. Une fois que je les ai tous désinstallés avec pip uninstall package_name, le problème a disparu. On dirait qu'ils ont des effets secondaires

5voto

Shakthifuture Points 21

Pytest par défaut, exécute les étapes de manière aléatoire. Utilisez cette option pour exécuter dans l'ordre.

Installer avec:

pip install pytest-order

Écrire la méthode de test comme ci-dessous :

import pytest

@pytest.mark.order(1)
def test_foo():
    assert True

@pytest.mark.order(2)
def test_bar():
    assert True

1voto

Pangur Points 546

Pour moi, le moyen le plus simple de corriger l'ordre d'exécution des tests est de les utiliser en tant que fixtures, qui sont exécutées de manière ordonnée par conception.

@pytest.fixture()
def test_a():
    print("exécution du test a en premier")
    pass

def test_b(test_a):
    print("exécution du test b après le test a")
    pass

Marquez la dépendance du test en tant que fixture et passez-la en argument au test dépendant.

0voto

zhihao he Points 11

Main.py :

import functools
import pytest
from demo import test_foo,test_hi

def check_depends(depends):
    try:
        for dep in depends:
            dep()
    except Exception as e:
        return dep
    else:
        return True

def pytest_depend(depends):
    def pytest_depend_decorator(func):
        stat = check_depends(depends)
        if stat is True:
            return func
        else:
            return pytest.mark.skip(True, reason="%s[skip] --> %s[Failed]" % (func.__name__, stat.__name__))(func)
    return pytest_depend_decorator

@pytest_depend([test_foo,test_hi])
def test_bar():
    pass

@pytest_depend([test_foo,test_hi])
def test_bar2():
    pass

demo.py :

def test_hi():
    pass
def test_foo():
    assert False

plateforme linux -- Python 3.5.2, pytest-3.8.2, py-1.6.0, pluggy-0.7.1 -- /usr/bin/python3

pytest -vrsx ./plugin.py

0voto

thorbjornwolf Points 691

Une solution pure-pytest consiste à utiliser pytest.mark.parametrize, en lui passant une liste ordonnée de sous-fonctions à appeler. Dans le problème indiqué dans cette question, vous devez importer les fonctions de test depuis vos fichiers (ou dans l'un d'eux). De toute façon, vous aurez besoin d'un fichier __init__.py.

Voici un exemple minimal de travail, sans imports:

tests/
- __init__.py  (vide)
- tests_that_need_ordering.py
- test_run_ordered.py

# tests_that_need_ordering.py
def C():
    assert False

def A():
    assert False

def B():
    pass

# test_run_ordered.py
import pytest

from .tests_that_need_ordering import A, B, C

@pytest.mark.parametrize("func", [C, B, A])
def test_things(func):
    func()

Remarquez que

  • le nom du fichier de sous-fonction ne commence ni ne se termine par test - sinon pytest le prendra directement en compte. De même, les tests à l'intérieur ont des noms qui ne seraient pas pris en compte si pytest les cherchait.
  • l'ordre de définition des fonctions est C A B. S'il s'agissait de simples fonctions test_* dans un fichier test_*, pytest les appellerait dans cet ordre.
  • l'ordre paramétré délibéré est C B A.

La sortie de l'exécution avec une verbosité -vv montre qu'ils ont été exécutés dans l'ordre délibéré C B A, et que les échecs sont signalés comme prévu:

tests/test_run_ordered.py::test_things[C] ÉCHEC
tests/test_run_ordered.py::test_things[B] RÉUSSI
tests/test_run_ordered.py::test_things[A] ÉCHEC

Pour référence future, j'ai fait cela avec Python 3.10.13, pytest-7.4.2

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