Как PyTest находит и определяет, какие тесты нужно запустить?

«Как PyTest находит и определяет, какие тесты нужно запустить?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PyTest использует соглашения об именовании и мощный механизм автообнаружения тестов (test discovery).

Основные правила именования:

  • Файлы: Тестовые файлы должны называться test_*.py или *_test.py.
  • Функции: Тестовые функции должны начинаться с test_.
  • Классы: Тестовые классы должны начинаться с Test (и не иметь метода __init__). Методы внутри таких классов, начинающиеся с test_, также будут обнаружены.

Пример структуры каталога:

project/
├── src/
└── tests/
    ├── test_math_operations.py   # Будет обнаружен
    ├── user_test.py              # Будет обнаружен
    └── helpers.py                # Проигнорирован (не соответствует шаблону)

Содержимое test_math_operations.py:

# Обнаружена как тестовая функция
def test_addition():
    assert 1 + 1 == 2

# Обнаружен как тестовый класс
class TestCalculator:
    # Обнаружен как тестовый метод
    def test_multiplication(self):
        assert 2 * 3 == 6

    # Игнорируется, так как не начинается с test_
    def helper_method(self):
        pass

Как управлять процессом обнаружения:

  1. Запуск из командной строки:
    • pytest — запустит все тесты в текущей директории и поддиректориях.
    • pytest tests/ — запустит тесты в конкретной директории.
    • pytest test_file.py::test_function — запустит конкретный тест.
  2. Использование маркеров: Декоратор @pytest.mark позволяет помечать тесты для выборочного запуска.

    import pytest
    
    @pytest.mark.slow
    def test_long_operation():
        ...

    Запуск: pytest -m slow

  3. Конфигурация: В файле pytest.ini можно переопределить стандартные шаблоны именования.