web-dev-qa-db-fra.com

Ordre d'exécution du cas de test dans pytest

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?

22
Kocka

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 :)

17
Frank T

Il existe également un plugin pytest-ordering qui semble répondre à vos besoins.

7
funky-future

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
4
Yaroslav Luchyt

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.

1
asterio gonzalez

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

0
zhihao he

Essaye ça:

@pytest.fixture(xxx)
def test_A():
    pass
    yield
    pass

@pytest.mark.usefixtures('test_A')
def test_B():
    pass
0
Ali Zwd