Ответ
В 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/