Sobes.tech
Назад к вопросам
Junior — Middle
75

Каким образом PyTest определяет, какие тестовые функции или случаи следует выполнить в процессе тестирования?

Компании, где спрашивали
РостелекомРостелеком

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

PyTest находит тесты по соглашениям об именовании и по структуре файлов, а затем собирает их в набор для запуска. Обычно он ищет файлы, классы и функции с тестовыми именами, а также учитывает маркеры, параметры и явные ограничения через команды запуска. В итоге выполняются только те тесты, которые попали в collection и не были исключены фильтрами.

Определение:

PyTest определяет, что запускать, через этап collection — он проходит по файловой системе, импортирует подходящие модули и ищет тестовые сущности по правилам. По умолчанию это файлы вида test_*.py или *_test.py, функции и методы с префиксом test_, а также классы с именем, начинающимся на Test и не имеющие собственного __init__. Дополнительно выбор можно сузить через -k, -m, путь к файлу/каталогу и параметры параметризованных тестов.

Пример использования:

import pytest

def test_sum():
    assert 1 + 1 == 2

@pytest.mark.smoke
def test_login():
    assert True

@pytest.mark.parametrize("a,b,result", [
    (1, 2, 3),
    (2, 2, 4),
])
def test_addition(a, b, result):
    assert a + b == result

Запуск:

pytest
pytest -k "login or sum"
pytest -m smoke
pytest tests/test_math.py

Пояснение кода:

Код показывает три разных случая, которые PyTest сможет собрать автоматически.
test_sum и test_login будут найдены по префиксу test_.
test_login дополнительно помечен маркером smoke, поэтому его можно запускать выборочно через -m smoke.
test_addition будет выполнен несколько раз, потому что parametrize создает отдельный тест-кейс на каждую строку данных.
При запуске pytest -k "login or sum" PyTest отфильтрует тесты по имени, а pytest tests/test_math.py ограничит поиск конкретным файлом.

Ключевые моменты:

  • PyTest сначала делает collection, а уже потом выполняет найденные тесты.
  • По умолчанию он ориентируется на имена файлов, функций, методов и классов.
  • Параметризованные тесты превращаются в несколько отдельных случаев.
  • Маркеры -m и выражение -k позволяют гибко отбирать нужные тесты.
  • Можно запускать тесты по конкретному пути, файлу, классу или функции.
  • Если тест не соответствует соглашениям PyTest, он просто не попадет в сборку.