pytest.ini: конфигурация для команды
В вашей команде 5 разработчиков. Один запускает pytest -v, другой pytest --tb=short, третий pytest -m "not slow". Все получают разный вывод. Как унифицировать?
Цель: Научиться настраивать pytest через pytest.ini для всей команды.
Вы точно готовы?
Убедитесь, что умеете:
# Запускать pytest с опциями
pytest -v --tb=short --cov=src
# Использовать маркеры
@pytest.mark.slow
def test_something():
passЕсли pytest опции непонятны — повторите предыдущие уроки.
Проблема: разные настройки у всех
Без pytest.ini
Разработчик 1:
pytest -v --tb=short tests/Разработчик 2:
pytest --cov=src --cov-report=html tests/Разработчик 3:
pytest -m "not slow" --maxfail=1 tests/CI:
pytest --tb=no --cov=src --cov-fail-under=80Проблемы:
- ❌ Каждый запускает по-разному
- ❌ Нужно помнить все опции
- ❌ Сложно синхронизировать команду
- ❌ Предупреждения о неизвестных маркерах
PytestUnknownMarkWarning: Unknown pytest.mark.slowРешение: pytest.ini
Создание pytest.ini
# pytest.ini (в корне проекта)
[pytest]
# Где искать тесты
testpaths = tests
# Опции по умолчанию
addopts =
-v
--tb=short
--strict-markers
# Регистрация маркеров
markers =
slow: Медленные тесты (> 5 секунд)
integration: Integration-тесты с внешними системами
unit: Unit-тесты (изолированные)Теперь все запускают просто:
pytest✅ Все опции применяются автоматически!
testpaths: где искать тесты
[pytest]
testpaths = testsБез testpaths:
# Pytest ищет тесты ВЕЗДЕ (медленно)
pytest # Сканирует весь проектС testpaths:
# Pytest ищет только в tests/ (быстро)
pytest # Сканирует только tests/✅ Быстрее discovery тестов!
Множественные директории:
[pytest]
testpaths =
tests
integration_testsaddopts: опции по умолчанию
[pytest]
addopts =
-v # Verbose режим
--tb=short # Короткий traceback
--strict-markers # Ошибка на неизвестных маркерах
--cov=src # Coverage для src/
--cov-report=term-missingТеперь:
pytest # Применяются все опции из addoptsМожно переопределить:
pytest --tb=long # Переопределяет --tb=short из addoptsmarkers: регистрация маркеров
[pytest]
markers =
slow: Медленные тесты (> 5 секунд)
integration: Integration-тесты с внешними системами
unit: Unit-тесты (изолированные)
smoke: Smoke-тесты (быстрая проверка)
api: Тесты API endpoints
db: Тесты с БДБез регистрации:
PytestUnknownMarkWarning: Unknown pytest.mark.slowС регистрацией:
pytest # Нет предупреждений ✅Просмотр маркеров:
pytest --markersРезультат:
@pytest.mark.slow: Медленные тесты (> 5 секунд)
@pytest.mark.integration: Integration-тесты с внешними системами
@pytest.mark.unit: Unit-тесты (изолированные)
...Практический пример: real-world pytest.ini
Для команды разработки
# pytest.ini
[pytest]
# === Где искать тесты ===
testpaths = tests
# === Опции по умолчанию ===
addopts =
# Verbose режим
-v
# Короткий traceback (удобнее читать)
--tb=short
# Строгие маркеры (ошибка на неизвестных)
--strict-markers
# Coverage
--cov=src
--cov-report=term-missing
--cov-report=html
# Остановка на первой ошибке (для быстрой отладки)
# --maxfail=1 # Раскомментировать для локальной разработки
# === Маркеры ===
markers =
# По скорости
slow: Медленные тесты (> 5 секунд)
fast: Быстрые тесты (< 1 секунда)
# По типу
unit: Unit-тесты (изолированные)
integration: Integration-тесты с внешними системами
e2e: End-to-end тесты (полный цикл)
# По зависимостям
requires_db: Требует PostgreSQL
requires_redis: Требует Redis
requires_network: Требует интернет
# По функциональности
api: Тесты API endpoints
auth: Тесты аутентификации
payments: Тесты платежей
# Специальные
smoke: Smoke-тесты (быстрая проверка)
regression: Regression-тесты (проверка старых багов)
# === Минимальная версия Python ===
minversion = 3.8
# === Паттерны для поиска тестов ===
python_files = test_*.py *_test.py
python_classes = Test*
python_functions = test_*
# === Игнорировать директории ===
norecursedirs =
.git
.venv
venv
node_modules
build
dist
*.egg-infoДля CI/CD
# pytest.ini (для CI)
[pytest]
testpaths = tests
addopts =
-v
--tb=short
--strict-markers
--cov=src
--cov-report=term
--cov-report=xml # Для SonarQube/Codecov
--cov-fail-under=80 # Минимум 80% покрытия
--maxfail=5 # Остановить после 5 ошибок (экономим время CI)
--junitxml=junit.xml # XML отчёт для CI
markers =
slow: Медленные тесты
integration: Integration-тесты
# Игнорировать warnings от зависимостей
filterwarnings =
ignore::DeprecationWarning:pkg_resourcesДополнительные настройки
Console output verbosity
[pytest]
# Уровень детализации
console_output_style = progress # classic, progress, countОпции:
classic— стандартный (по умолчанию)progress— прогресс барcount— счётчик (1/100, 2/100, ...)
Log настройки
[pytest]
# Логирование в тестах
log_cli = true
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)s] %(message)s
log_cli_date_format = %Y-%m-%d %H:%M:%SТеперь print() и logging работают:
import logging
def test_something():
logging.info("Test started") # Будет выведено!
print("Debug info") # Будет выведено!Warnings фильтры
[pytest]
# Игнорировать конкретные warnings
filterwarnings =
error # Превратить все warnings в ошибки
ignore::DeprecationWarning # Игнорировать DeprecationWarning
ignore::PendingDeprecationWarning
ignore:.*U.*mode is deprecated:DeprecationWarning # RegexTimeout для тестов
pip install pytest-timeout[pytest]
# Таймаут 300 секунд для каждого теста
timeout = 300Множественные конфигурации
setup.cfg (альтернатива pytest.ini)
# setup.cfg
[tool:pytest]
testpaths = tests
addopts = -v --tb=short
markers =
slow: Медленные тесты✅ Работает так же как pytest.ini!
pyproject.toml (для Poetry/Hatch)
# pyproject.toml
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = ["-v", "--tb=short"]
markers = [
"slow: Медленные тесты",
]Приоритет
Pytest ищет конфигурацию в порядке:
pytest.inipyproject.tomlsetup.cfgtox.ini
✅ Используйте pytest.ini для максимальной совместимости!
Практический workflow
Локальная разработка
# pytest.ini настроен на -v --tb=short
pytest
# Быстрый режим: только быстрые тесты
pytest -m "not slow"
# Отладка: остановка на первой ошибке
pytest -x
# С отладчиком
pytest --pdbCI/CD
# .gitlab-ci.yml
test:
script:
# pytest.ini уже настроен!
- pytest # Использует настройки из pytest.inipytest.ini для CI:
[pytest]
addopts =
--cov=src
--cov-fail-under=80 # Блокирует CI если < 80%
--maxfail=5
--junitxml=junit.xmlЧто вы изучили
- pytest.ini — единая конфигурация для команды
- testpaths — где искать тесты
- addopts — опции по умолчанию
- markers — регистрация маркеров
- filterwarnings — управление warnings
- Множественные форматы — pytest.ini, setup.cfg, pyproject.toml
Следующий урок
Отлично! Теперь pytest настроен для всей команды. Но как переиспользовать фикстуры между разными файлами тестов?
Переходите к уроку 6: conftest.py: переиспользование фикстур
В следующем уроке вы узнаете:
conftest.pyдля глобальных фикстур- Автоиспользование фикстур (autouse)
- Организация фикстур в проекте
- Scope и порядок выполнения
Устранение неисправностей
Проверьте что:
- Файл называется ТОЧНО
pytest.ini(неpytest.cfg) - Файл в корне проекта (рядом с tests/)
- Секция называется
[pytest](не[tool:pytest])
# ❌ НЕПРАВИЛЬНО
[pytest]
addopts = -v --tb=short # Одна строка
# ✅ ПРАВИЛЬНО
[pytest]
addopts =
-v
--tb=shortДобавьте --strict-markers в addopts:
[pytest]
addopts =
--strict-markers # Превращает warnings в ошибки
markers =
slow: Описание# Локально (используется pytest.ini)
pytest
# CI (переопределяем опции)
pytest --tb=no --maxfail=5Или используйте переменные окружения:
[pytest]
addopts =
-v # В CI добавится --cov-fail-under=80# CI
export PYTEST_ADDOPTS="--cov-fail-under=80"
pytest