Перейти к содержанию

Отладка pytest

Остановиться внутри теста на Python.

Предпосылки

  • debugpy, установленный в тот интерпретатор, который выполняет ваши тесты:
.venv/bin/pip install debugpy
  • pytest в том же окружении

Короткий путь: тест под курсором

:DebugTest

или

bugsaur gui --project . --test-at tests/test_orders.py:24

Bugsaur запускает выбранный pytest-узел через debugpy. Адаптер, окружение и рабочий каталог приходят из профиля.

Буфер должен быть сохранён, а сохранённые точки останова не подхватываются: запуск теста использует только точки текущего запроса.

Длинный путь: профиль pytest

Для запуска под отладчиком целого набора или каталога:

[profiles.tests]
adapter = "debugpy"
adapter_command = "${root}/.venv/bin/python"
program = "."
args = ["-x", "tests/"]

[profiles.tests.launch_arguments]
module = "pytest"
python = "${root}/.venv/bin/python"

module = "pytest" — это аварийный выход: debugpy принимает ключ module, а в схеме профиля отдельного поля для него нет.

-x останавливает на первом падении, а под отладчиком обычно именно это и нужно.

bugsaur gui --project . --profile tests --break src/orders.py:88

Полезные аргументы pytest

Аргумент Что делает
-x остановиться после первого падения
-s не перехватывать вывод, чтобы print доходил до панели Logs
-k выражение только тесты с подходящим именем
tests/test_orders.py::test_create один конкретный тест
args = ["-x", "-s", "tests/test_orders.py::test_create"]

Два интерпретатора

adapter_command выбирает интерпретатор, который запускает адаптер; launch_arguments.python — тот, который выполняет ваш код. Обычно это один и тот же venv, и No module named debugpy почти всегда означает, что один из них указывает в другое место.

Если не работает

Симптом Что делать
No module named debugpy поставьте его в интерпретатор из adapter_command
No module named pytest поставьте pytest в то же окружение
Точки останова в фикстуре не срабатывают фикстура закэширована с прошлого теста — проверьте её scope
ImportError для вашего пакета рабочий каталог — Рабочий каталог
Не видно вывода print добавьте -s