Порядок выполнения тестов в 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 – для глобального приоритета групп. · Кастомный хук – когда стандартных средств не хватает.
Главное правило: тесты должны быть независимыми, где это возможно. Если порядок критичен — оформляйте зависимости явно, через фикстуры. 🔁