Какие существуют способы группировки тестов в pytest?

«Какие существуют способы группировки тестов в pytest?» — вопрос из категории Тестирование, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В pytest тесты можно группировать как для логической организации кода, так и для выборочного запуска. Основные подходы:

1. Маркеры (Markers)

Это самый гибкий способ для функциональной группировки и выборочного запуска тестов. Тесты помечаются специальными декораторами @pytest.mark.<marker_name>.

Пример:

import pytest

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

@pytest.mark.regression
@pytest.mark.slow
def test_complex_calculation():
    # ... долгие вычисления
    assert 1 + 1 == 2

Запуск тестов по маркерам:

# Запустить только smoke-тесты
pytest -m smoke

# Запустить все, кроме медленных
pytest -m "not slow"

# Запустить тесты, которые являются и regression, и slow
pytest -m "regression and slow"

Best practice: Регистрируйте свои маркеры в файле pytest.ini или pyproject.toml, чтобы избежать предупреждений.

# pytest.ini
[pytest]
markers = 
    smoke: critical path tests
    regression: regression tests
    slow: slow running tests

2. Классы

Классы используются для логического объединения тестов, связанных с одним объектом или функциональностью. Названия классов должны начинаться с Test.

class TestUserAuth:
    def test_login(self):
        assert True

    def test_logout(self):
        assert True

    def test_invalid_password(self):
        assert False

3. Файлы и директории

pytest автоматически обнаруживает тесты в файлах test_*.py или *_test.py. Разделение тестов по разным файлам и директориям является естественным способом их группировки по модулям или компонентам приложения.

/tests
├── test_api
│   ├── test_auth.py
│   └── test_payments.py
└── test_db
    └── test_models.py

Запустить все тесты, связанные с API:

pytest tests/test_api/