Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Отладка: понимаем ошибки
debugging_and_troubleshooting

Отладка: понимаем ошибки

pytest -v/-vv, --tb опции, --pdb, --lf/--ff, чтение сообщений об ошибках

Вы уже написали 50 тестов. 3 из них падают. Как быстро найти причину и исправить?

Цель: научиться эффективно отлаживать тесты и читать сообщения об ошибках pytest.

Проблема: непонятные ошибки

Минимальный вывод по умолчанию

pytest

Результат:

============================= test session starts ==============================
collected 10 items

tests/test_bank.py .F.F.....                                             [100%]

=================================== FAILURES ===================================
_______________________________ test_withdraw __________________________________

    def test_withdraw():
>       account.withdraw(200)
E       ValueError: Insufficient funds

tests/test_bank.py:25: ValueError
========================== 1 failed, 9 passed in 0.12s =========================

Проблемы:

  • ❌ Не видно какие именно тесты прошли
  • ❌ Мало информации об ошибке

Решение 1: Verbose режимы

pytest -v: показать все тесты

pytest -v

Результат:

tests/test_bank.py::test_create_account PASSED                          [ 10%]
tests/test_bank.py::test_deposit PASSED                                 [ 20%]
tests/test_bank.py::test_withdraw FAILED                                [ 30%]

✅ Теперь видно каждый тест!

pytest -vv: ещё больше деталей

pytest -vv

Результат для параметризованных тестов:

tests/test_bank.py::test_deposit[100-50-150] PASSED                     [ 20%]
tests/test_bank.py::test_deposit[0-100-100] PASSED                      [ 40%]

✅ Показывает параметры для каждого теста!

Когда использовать

# Разработка: хочу видеть все тесты pytest -v # Отладка параметризованных тестов pytest -vv # CI/CD: минимальный вывод для скорости pytest

Решение 2: Stacktrace опции

--tb=short: короткий stacktrace

pytest --tb=short

Результат:

=================================== FAILURES ===================================
_______________________________ test_withdraw __________________________________
tests/test_bank.py:25: in test_withdraw
    account.withdraw(200)
E   ValueError: Insufficient funds

✅ Только суть ошибки (без полного stacktrace)

--tb=long: полный stacktrace

pytest --tb=long

✅ Полный путь ошибки (где именно она произошла)

--tb=no: без stacktrace

pytest --tb=no

✅ Только статистика (для CI когда логи большие)

Stacktrace опции

--tb=auto # Автоматический (default) --tb=long # Полный stacktrace --tb=short # Короткий stacktrace --tb=line # Только строка с ошибкой --tb=no # Без stacktrace

Рекомендации:

  • --tb=short — для большинства случаев ✅
  • --tb=long — когда ошибка глубоко в коде
  • --tb=no — для CI (чтобы логи не раздувались)

Решение 3: Интерактивная отладка --pdb

Что такое pdb?

pdb (Python Debugger) — встроенный отладчик Python, который позволяет остановить программу в нужном месте, изучить значения переменных и найти причину бага без перезапуска тестов.

pytest --pdb: остановка на ошибке

pytest --pdb

Что происходит:

  1. Тест падает
  2. pytest останавливается ровно на месте ошибки
  3. Открывается интерактивная консоль Python (pdb)

Результат:

=================================== FAILURES ===================================
_______________________________ test_withdraw __________________________________

    def test_withdraw():
>       account.withdraw(200)

tests/test_bank.py:25
(Pdb) _

✅ Вы внутри теста! Можете проверить что угодно прямо здесь и сейчас.

Команды pdb

(Pdb) account.balance 100 (Pdb) print(account.balance) 100 (Pdb) account.deposit(50) (Pdb) account.balance 150 (Pdb) c # Continue (продолжить выполнение) (Pdb) q # Quit (выйти из pdb)

Практический пример

def test_complex_calculation(): """Тест сложного расчёта""" user = User("Alice", 25) account = BankAccount(1000) result = calculate_interest(account, user.age) assert result == 50 # FAILED

В pdb:

(Pdb) result 45 # Ага, получили 45 вместо 50! (Pdb) calculate_interest(account, 25) 45 # Для возраста 25 получается 45 (не 50!) # Нашли баг в тесте! Expected должно быть 45, не 50

Решение 4: Smart test execution

--lf: запустить только упавшие тесты

# Первый запуск: 10 тестов, 3 упали pytest # Повторный запуск: только 3 упавших теста pytest --lf # last-failed

✅ Быстро проверяем что баги исправлены!

--ff: сначала упавшие, потом остальные

pytest --ff # failed-first

✅ Ускоряет обнаружение новых ошибок!

-x: остановка на первой ошибке

pytest -x # stop on first failure

✅ Не тратим время на остальные тесты — сразу чиним первую ошибку!

--maxfail=N: остановка после N ошибок

pytest --maxfail=3 # Остановиться после 3 ошибок

✅ Баланс между -x (слишком рано) и без флага (слишком поздно)

Комбинирование опций (практика)

Сценарий 1: быстрая отладка одного теста

pytest tests/test_bank.py::test_withdraw -vv --pdb

Сценарий 2: исправляем упавшие тесты

# 1. Запускаем все тесты pytest # 2. Смотрим только упавшие pytest --lf -vv # 3. Отлаживаем первый упавший pytest --lf -x --pdb # 4. После исправления — снова только упавшие pytest --lf

Сценарий 3: CI/CD режим

pytest --tb=no -x -q

Читаем сообщения об ошибках

AssertionError: простая ошибка

=================================== FAILURES ===================================
_______________________________ test_deposit ___________________________________

    def test_deposit():
        account = BankAccount(100)
        account.deposit(50)
>       assert account.balance == 200
E       assert 150 == 200
E        +  where 150 = <BankAccount object at 0x...>.balance

tests/test_bank.py:15: AssertionError

Как читать:

  1. > — строка с ошибкой
  2. E assert 150 == 200 — что пошло не так (получили 150, ожидали 200)
  3. E + where — откуда взялось значение 150

Решение: ожидаемое значение неверно — должно быть 150, не 200.

ValueError: исключение в коде

=================================== FAILURES ===================================
_______________________________ test_withdraw __________________________________

    def test_withdraw():
        account = BankAccount(100)
>       account.withdraw(200)

tests/test_bank.py:25:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    def withdraw(self, amount):
        if amount > self.balance:
>           raise ValueError("Insufficient funds")
E           ValueError: Insufficient funds

src/bank_account.py:32: ValueError

Решение: тест пытается снять 200, но на счёте только 100 — это корректное поведение! Нужно либо изменить тест, либо добавить pytest.raises.

AttributeError: метод не найден

E AttributeError: 'BankAccount' object has no attribute 'get_balance'

Решение: опечатка в названии метода (get_balance вместо balance) или метод не реализован.

TypeError: неправильные аргументы

E TypeError: deposit() missing 1 required positional argument: 'amount'

Решение: забыли передать аргумент amount.

Практический workflow отладки

  1. Запустите тесты: pytest -v
  2. Если упали — смотрим детали: pytest --lf -vv --tb=short
  3. Отлаживаем интерактивно: pytest --lf -x --pdb
  4. Исправляем код
  5. Проверяем исправление: pytest --lf
  6. Запускаем все тесты: pytest

Что вы изучили

  • pytest -v/-vv — детальный вывод тестов
  • --tb опции — контроль stacktrace
  • --pdb — интерактивная отладка
  • --lf/--ff — умное переиспользование упавших тестов
  • -x/--maxfail — ранняя остановка
  • Чтение ошибок — AssertionError, ValueError, TypeError
  • Практический workflow — от ошибки до исправления

Поздравляем! 🎉

Вы завершили курс «Pytest с нуля»! Теперь вы умеете писать базовые тесты, организовывать их в проекте, тестировать классы и ошибки, писать чистые тесты с AAA-паттерном, параметризовать тесты, группировать их маркерами, использовать фикстуры и отлаживать падения.

Что дальше? Переходите к более продвинутым темам: мокам и патчингу, coverage, плагинам и хукам, асинхронному тестированию.

Устранение неисправностей

Проверьте свои знания

Вопросы ещё не добавлены

Вопросы для этой подтемы ещё не добавлены.