Порядок выполнения тестового примера в pytest

Я использую pytest. У меня есть два файла в каталоге. В одном из файлов есть длинный тестовый сценарий, который генерирует некоторый вывод. В другом файле есть тестовый пример, который считывает этот вывод. Как я могу обеспечить правильный порядок выполнения двух тестовых случаев? Есть ли другая альтернатива, кроме того, что тестовые примеры находятся в одном файле в правильном порядке?

Ответ 1

В общем, вы можете настроить поведение практически любой части pytest, используя четко определенные хуки.

В вашем случае вам нужен хук "pytest_collection_modifyitems", который позволяет переупорядочивать собранные тесты на месте.

Тем не менее, кажется, что заказывать ваши тесты должно быть проще - в конце концов, это Python! Поэтому я написал плагин для упорядочивания тестов: "pytest-ordering". Проверьте документы или установите его с pypi. Прямо сейчас я рекомендую использовать @pytest.mark.first и @pytest.mark.second или один из маркеров @pytest.mark.order #, но у меня есть некоторые идеи по поводу более полезных API. Предложения приветствуются :)

Ответ 2

Похоже, Pytest запускает тесты в алфавитном порядке. Таким образом, вы можете попробовать так:

def test_a_first_test():
    pass

def test_b_second_test():
    pass

def test_o_middle_test():
    pass

Ответ 3

Есть также плагин pytest-ordering, который, кажется, соответствует вашим требованиям.

Ответ 4

Возможно, вы можете использовать плагин для зависимостей pytest, где вы можете легко установить тестовые зависимости:

@pytest.mark.dependency()
def test_long():
    pass

@pytest.mark.dependency(depends=['test_long'])
def test_short():
    pass

Таким образом, test_short будет выполняться только в случае успеха test_long и принудительно выполнять последовательность выполнения.

Ответ 5

Попробуйте это:

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

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

Ответ 6

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

платформа Linux - Python 3.5.2, pytest-3.8.2, py-1.6.0, pluggy-0.7.1 -/usr/bin/python3

pytest -vrsx./plugin.py

Ответ 7

Убедитесь, что у вас установлен пакет для заказа pytest. Для подтверждения перейдите в настройки Pycharm >> Project Interpreter >> и найдите pytest-ordering: Если он недоступен, установите его. Настройки Pycharm >> Project Interpreter >> Нажмите на кнопку + и выполните поиск Pytest-ordering, установите его. Вуаля !! Это определенно будет работать.

Ответ 8

Используйте опцию '- random-dont-reorganize' или '-p no: randomly', доступную в плагине pytest-randomly, это будет просто запустите тест в том же порядке, который вы упомянули в своем модуле.

Модуль:

import pytest

def test_three():
    assert True

def test_four():
    assert True

def test_two():
    assert True

def test_one():
    assert True

Исполнение:

(tmp.w95BqE188N) [email protected]:~/$ py.test --randomly-dont-reorganize test_dumm.py
======================================================================== test session starts ========================================================================
platform linux2 -- Python 2.7.12, pytest-3.10.1, py-1.5.4, pluggy-0.7.1 -- /tmp/tmp.w95BqE188N/bin/python2
cachedir: .pytest_cache
Using --randomly-seed=1566829391
rootdir: /home/rkalaiselvan, inifile: pytest.ini
plugins: randomly-1.2.3, timeout-1.3.1, cov-2.6.0, mock-1.10.0, ordering-0.6
collected 4 items

test_dumm.py::test_three PASSED
test_dumm.py::test_four PASSED
test_dumm.py::test_two PASSED
test_dumm.py::test_one PASSED

(tmp.w95BqE188N) [email protected]:~/$ py.test -p no:randomly test_dumm.py
======================================================================== test session starts ========================================================================
platform linux2 -- Python 2.7.12, pytest-3.10.1, py-1.5.4, pluggy-0.7.1 -- /tmp/tmp.w95BqE188N/bin/python2
cachedir: .pytest_cache
Using --randomly-seed=1566829391
rootdir: /home/rkalaiselvan, inifile: pytest.ini
plugins: randomly-1.2.3, timeout-1.3.1, cov-2.6.0, mock-1.10.0, ordering-0.6
collected 4 items

test_dumm.py::test_three PASSED
test_dumm.py::test_four PASSED
test_dumm.py::test_two PASSED
test_dumm.py::test_one PASSED