J'utilise pytest. J'ai deux fichiers dans un répertoire. Dans l'un des fichiers, il existe un long scénario de test qui génère une sortie. Dans l'autre fichier, un scénario de test lit cette sortie. Comment puis-je assurer le bon ordre d'exécution des deux cas de test? Existe-t-il une autre solution que de placer les tests élémentaires dans le même fichier dans le bon ordre?
En général, vous pouvez configurer le comportement de n'importe quelle partie de pytest en utilisant ses crochets bien spécifiés .
Dans votre cas, vous souhaitez utiliser le hook "pytest_collection_modifyitems", qui vous permet de réorganiser les tests collectés sur place.
Cela dit, il semblerait que commander vos tests devrait être plus facile - c'est Python après tout! J'ai donc écrit un plugin pour commander des tests: "pytest-ordering". Consultez les docs ou installez-les à partir de pypi . À l'heure actuelle, je recommande d'utiliser @ pytest.mark.first et @ pytest.mark.second, ou l'un des marqueurs @ pytest.mark.order #, mais j'ai quelques idées sur des API plus utiles. Suggestions bienvenues :)
Il existe également un plugin pytest-ordering qui semble répondre à vos besoins.
Il semble que pytest exécute les tests dans l’ordre alphabétique. Donc, vous pouvez essayer de cette façon:
def test_a_first_test():
pass
def test_b_second_test():
pass
def test_o_middle_test():
pass
Peut-être pourriez-vous envisager d’utiliser le plugin dependency pytest, où vous pourrez facilement définir les dépendances de test:
@pytest.mark.dependency()
def test_long():
pass
@pytest.mark.dependency(depends=['test_long'])
def test_short():
pass
De cette façon, test_short
ne sera exécuté que si test_long
est un succès et force la séquence d'exécution également.
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
plate-forme linux - Python 3.5.2, pytest-3.8.2, py-1.6.0, pluggy-0.7.1 -/usr/bin/python3
pytest -vrsx ./plugin.py
Essaye ça:
@pytest.fixture(xxx)
def test_A():
pass
yield
pass
@pytest.mark.usefixtures('test_A')
def test_B():
pass