Настройка маркеров, testpaths, addopts. Единая конфигурация для всей команды
В вашей команде 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 опции непонятны — повторите предыдущие уроки.
Разработчик 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]
# Где искать тесты
testpaths = tests
# Опции по умолчанию
addopts =
-v
--tb=short
--strict-markers
# Регистрация маркеров
markers =
slow: Медленные тесты (> 5 секунд)
integration: Integration-тесты с внешними системами
unit: Unit-тесты (изолированные)Теперь все запускают просто:
pytest✅ Все опции применяются автоматически!
[pytest]
testpaths = testsБез testpaths:
# Pytest ищет тесты ВЕЗДЕ (медленно)
pytest # Сканирует весь проектС testpaths:
# Pytest ищет только в tests/ (быстро)
pytest # Сканирует только tests/✅ Быстрее discovery тестов!
Множественные директории:
[pytest]
testpaths =
tests
integration_tests[pytest]
addopts =
-v # Verbose режим
--tb=short # Короткий traceback
--strict-markers # Ошибка на неизвестных маркерах
--cov=src # Coverage для src/
--cov-report=term-missingТеперь:
pytest # Применяются все опции из addoptsМожно переопределить:
pytest --tb=long # Переопределяет --tb=short из addopts[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-тесты (изолированные)
...
# 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# 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[pytest]
# Уровень детализации
console_output_style = progress # classic, progress, countОпции:
classic — стандартный (по умолчанию)progress — прогресс барcount — счётчик (1/100, 2/100, ...)[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") # Будет выведено![pytest]
# Игнорировать конкретные warnings
filterwarnings =
error # Превратить все warnings в ошибки
ignore::DeprecationWarning # Игнорировать DeprecationWarning
ignore::PendingDeprecationWarning
ignore:.*U.*mode is deprecated:DeprecationWarning # Regexpip install pytest-timeout[pytest]
# Таймаут 300 секунд для каждого теста
timeout = 300# setup.cfg
[tool:pytest]
testpaths = tests
addopts = -v --tb=short
markers =
slow: Медленные тесты✅ Работает так же как pytest.ini!
# pyproject.toml
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = ["-v", "--tb=short"]
markers = [
"slow: Медленные тесты",
]Pytest ищет конфигурацию в порядке:
pytest.inipyproject.tomlsetup.cfgtox.ini✅ Используйте pytest.ini для максимальной совместимости!
# pytest.ini настроен на -v --tb=short
pytest
# Быстрый режим: только быстрые тесты
pytest -m "not slow"
# Отладка: остановка на первой ошибке
pytest -x
# С отладчиком
pytest --pdb# .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Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.
Далее: conftest.py: переиспользование фикстур