Как pytest трактует маркер, установленный на тестовом классе, при сборке методов этого класса?
Маркер, установленный на тестовом классе, применяется ко всем тестовым методам, собранным внутри этого класса. Поэтому такие методы можно совместно отбирать через выражение -m, а сам маркер доступен как метаданные соответствующих узлов тестового дерева.
Маркер не запускает методы автоматически, не меняет порядок выполнения и сам по себе не влияет на фикстуры.
В больших тестовых наборах отдельные тесты нужно группировать по свойствам: медленные, интеграционные, требующие базы данных или временно нестабильные. Маркеры pytest решают эту задачу декларативно: свойство задаётся рядом с тестом, а выбор набора выполняется отдельно от его реализации.
Размещение маркера на классе уменьшает дублирование, когда одно правило относится ко всем тестам данного набора.
Предположим, класс содержит десятки интеграционных тестов. Если пометить каждый метод отдельно, легко забыть маркер при добавлении нового теста или получить неоднородную группу.
Неверное понимание механизма также опасно: разработчик может ожидать, что маркер автоматически включит фикстуру, изменит порядок тестов или будет применён к любому коду внутри класса. На самом деле маркер является метаданными тестовых узлов и используется средствами pytest, которые эти метаданные анализируют.
Во время сбора pytest создаёт узел для класса и отдельные узлы для его тестовых методов. Маркер класса наследуется тестовыми узлами методов, поэтому каждый такой тест рассматривается как помеченный.
Например:
Оба метода будут иметь маркер integration и попадут в выборку при запуске с соответствующим выражением маркеров. При этом маркер не является фикстурой: он не выполняет подготовку данных и не создаёт внешние ресурсы.
Фикстура может самостоятельно проверить маркер через объект запроса и изменить поведение, но это уже явная связь между фикстурой и метаданными. Без такой логики маркер влияет главным образом на выбор тестов, отчётность и обработку плагинами.
Практическое ограничение состоит в том, что пользовательские маркеры следует регистрировать в конфигурации проекта. Это позволяет pytest проверять написание маркеров и обнаруживать опечатки, вместо того чтобы молча принимать неизвестное имя.
В проекте класс содержит интеграционные тесты платёжного сервиса. Команда хочет запускать их отдельно от быстрых модульных тестов.
Первый вариант — поставить маркер на каждый метод. Он прост, но требует ручного поддержания списка и допускает забытые тесты. Второй вариант — пометить весь класс. Это уменьшает дублирование и автоматически охватывает новые методы, добавленные в класс.
Выбран второй вариант: маркер ставят на класс, регистрируют его в конфигурации, а запуск интеграционного набора выполняют по маркеру. Фикстуру подключения к внешнему сервису при этом подключают отдельно, например через usefixtures или зависимость теста, поскольку маркер сам по себе такую фикстуру не активирует.
Нет. Маркер и фикстура — разные механизмы. Совпадение имён ничего не связывает: маркер хранится в метаданных теста, а фикстура выполняется только при явном запросе, через usefixtures или при наличии автоматического запуска.
Если требуется связать их, фикстура должна явно проверить наличие маркера у тестового узла через объект request. Такое решение полезно для условной настройки окружения, но создаёт скрытую зависимость и усложняет понимание теста.
Да, метод может получить дополнительные или конфликтующие метаданные, но способ обработки зависит от конкретного маркера. Сам факт наличия маркера класса не означает, что его можно универсально отменить простой аннотацией.
Поэтому для исключения одного теста обычно надёжнее изменить структуру набора: вынести исключаемый тест в другой класс или использовать явную логику выбора. Для стандартных и пользовательских маркеров нужно отдельно проверить, как именно плагин или команда запуска интерпретирует комбинацию меток.
Да. Параметризация создаёт отдельные тестовые случаи на основе исходного тестового узла, и маркер класса сохраняется у этих случаев. Поэтому все варианты параметризованного метода участвуют в выборке по маркеру.
Это важно для отчётности: один метод может дать несколько результатов, но каждый вариант всё равно остаётся частью помеченной группы. Сам маркер не меняет количество вариантов — оно определяется параметризацией.