Гарантирует ли pytest порядок выполнения тестов между разными тестовыми функциями?
Нет, pytest не гарантирует смысловой порядок выполнения тестов. Текущий порядок обычно определяется порядком сборки, но на него нельзя надёжно опираться: его могут изменить структура файлов, параметры запуска или плагины. Каждый тест должен быть независимым от результатов и побочных эффектов других тестов.
Автоматические тесты должны выявлять ошибки в коде, а не зависеть от случайного порядка запуска. Подход с независимыми тестами появился как ответ на проблему хрупких наборов, где перестановка тестов меняет результат прогона.
Поэтому тестовый фреймворк собирает и запускает тесты как набор отдельных проверок, но не предоставляет порядок как часть контракта поведения теста.
Если один тест изменяет глобальное состояние, базу данных, переменные окружения или файлы, а другой ожидает это изменение, набор становится зависимым от порядка. Такой дефект может проявляться только при полном прогоне, повторном запуске или на CI.
Попытка исправить проблему ручной сортировкой тестов маскирует причину. Кроме того, порядок, который работает локально, может измениться после добавления файла, параметризации или плагина.
pytest выполняет тесты в порядке, полученном на этапе collection. Этот порядок является техническим результатом обнаружения тестов, а не гарантией, что один тест будет выполнен раньше другого для корректности сценария.
Правильное решение — изолировать состояние:
Если порядок необходим для отдельного сценария, это обычно признак, что несколько проверок нужно объединить в один тест или заменить на явно моделируемый workflow. Плагины для упорядочивания допустимы для специальных случаев, но они не устраняют общую проблему связанности и усложняют диагностику.
В проекте один тест создавал пользователя, а следующий проверял его наличие. Локально они проходили, потому что обычно собирались в ожидаемом порядке; после добавления нового тестового файла проверка начала падать на CI.
Рассматривались два варианта. Плагин для принудительного порядка был быстрым решением, но сохранил скрытую зависимость и сделал набор чувствительным к конфигурации. Перенос создания пользователя в фикстуру с областью действия функции устранил связанность, хотя увеличил число операций подготовки.
Выбран был второй вариант: каждый тест получил собственные данные и очистку. В результате перестановка тестов и запуск отдельного теста стали давать одинаковый результат.
Нет. Повторяемый порядок в конкретной среде не становится гарантией API. Он может зависеть от файловой системы, версии pytest, способа импорта и установленных плагинов.
Полезно запускать тесты по отдельности, менять порядок с помощью подходящего инструмента или плагина, а также повторять только подозрительный набор в разных комбинациях. Если результат меняется, нужно искать общее изменяемое состояние, незакрытый ресурс или данные, оставленные предыдущим тестом.
Нет. Для дорогих неизменяемых ресурсов допустима более широкая область действия фикстуры, например на модуль или сессию. Но изменяемое состояние нужно сбрасывать между тестами либо выдавать каждому тесту изолированную копию; иначе выигрыш во времени достигается ценой недетерминированности.