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