Порядок выполнения тестов в Pytest

Ко мне обратился в лс Александр Миронов с запросом организации порядка запуска тестов, так и созрел данный пост)

🧪 Как заставить pytest выполнять POST тесты перед GET API-тесты часто требуют: сначала создать ресурс (POST), потом проверить его (GET). Рассказываю, как управлять порядком в pytest — от простых способов к сложным.

1️⃣ Фикстуры с зависимостями (рекомендую)

Всю логику создания выносим в фикстуру, а GET-тесты используют её результат. Порядок гарантирован, тесты остаются независимыми.

@pytest.fixture(scope=“session”) def created_resource(): # POST запрос resource_id = requests.post(…).json()[“id”] yield resource_id # удаление после всех тестов

def test_get_resource(created_resource): GET запрос с resource_id

✅ Плюс: надёжно, явно, нет коллизий.

2️⃣ Плагин pytest-order

Добавляет маркеры для номеров или зависимостей.

pip install pytest-order

@pytest.mark.order(1) def test_post():

@pytest.mark.order(2) def test_get():

Можно использовать after=“test_post” или before=“test_get”. Просто и читаемо.

3️⃣ Сортировка через pytest_collection_modifyitems

В conftest.py меняем порядок собранных тестов по маркерам.

def pytest_collection_modifyitems(config, items): post = [i for i in items if “post” in i.keywords] get = [i for i in items if “get” in i.keywords] items[:] = post + get + [i for i in items if i not in post+get]

Тесты помечаем @pytest.mark.post и @pytest.mark.get. Группы будут идти в заданном порядке, но внутри групп — как собралось.

4️⃣ Полный ручной контроль с помощью хуков

Перехватываем выполнение и сами вызываем тесты. Подходит для сложных сценариев.

# conftest.py class OrderedPlugin: def pytest_collection_modifyitems(self, items): self.post = [i for i in items if “post” in i.keywords] self.get = [i for i in items if “get” in i.keywords] items.clear()

def pytest_runtestloop(self, session): for item in self.post + self.get: session.config.hook.pytest_runtest_protocol(item=item, nextitem=None) return True

def pytest_configure(config): config.pluginmanager.register(OrderedPlugin())

✅ Полный контроль, но сложнее поддерживать.

🧠 Что выбрать?

· Фикстуры – если создание ресурса нужно многим тестам. · pytest-order – когда нужно просто задать номера или зависимости. · Сортировка в conftest – для глобального приоритета групп. · Кастомный хук – когда стандартных средств не хватает.

Главное правило: тесты должны быть независимыми, где это возможно. Если порядок критичен — оформляйте зависимости явно, через фикстуры. 🔁