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

Отладка теста под курсором

Поставьте курсор в тест, нажмите одну клавишу и окажитесь в отладчике. Ни профиля под каждый тест, ни фильтра руками.

Из редактора

:DebugTest

по умолчанию <leader>dT.

Из терминала

bugsaur gui --project . --test-at src/lib.rs:42
bugsaur run --project . --test-at tests/test_orders.py:24

--test-at <файл:строка> подменяет программу профиля выбранным тестом.

Что при этом происходит

Профиль всё равно используется: механизм отладки теста наследует из него адаптер, окружение, рабочий каталог и прочие launch-настройки. Подменяются только программа, её аргументы и сборка — на то, что нужно выбранному тесту.

Язык Как собирается и запускается
Rust cargo test --no-run --message-format=json, затем полученный тестовый бинарник
Go тестовый запуск через dlv для выбранного пакета или файла
Python выбранный pytest-узел через debugpy
PHP PHPUnit через testCommand, см. ниже

Правила, которые надо знать

Курсор должен быть внутри тестовой функции

Курсор может стоять на объявлении метода или в любой строке его тела — Bugsaur выберет содержащий его тестовый метод.

На любой другой строке команда отказывает и ничего не запускает. В Rust
годится и строка с атрибутом `#[test]`.

На строке **тестовой группы** — `mod tests` или PHP-класса с распознанными
тестовыми методами — та же команда запускает всю группу. Обычные PHP-классы
не считаются тестовыми группами и не получают знак запуска в gutter.

Буфер должен быть сохранён

Бэкенд читает файл с диска. Несохранённый текст нельзя надёжно сопоставить с собранным бинарником.

Сохранённые точки останова не подхватываются

В отличие от :DebugStart, запуск теста использует только точки текущего запроса. Нужную точку ставьте в этой же сессии.

Флаги взаимоисключающие

--test-at нельзя сочетать с --program: один говорит отладь этот тест, другой — отладь эту программу.

Работает с run и gui, но не с serve.

PHP требует одной дополнительной строки

PHP запускает не Bugsaur, поэтому профиль обязан сказать, как запустить PHPUnit там, где живёт PHP:

[profiles.docker.launch_arguments]
sessionMode = "server"
port = 9003
pathMappings = { "/app" = "${root}" }
testCommand = ["docker", "compose", "exec", "-T", "-e", "XDEBUG_TRIGGER=1", "php", "php", "vendor/bin/phpunit"]

:DebugTest распознаёт методы test* и методы с атрибутом #[Test] в файлах .php. Для метода передаётся --filter Class::method, а на объявлении класса, содержащего такие методы, запускается весь файл.

testCommand выполняется после того, как адаптер начал слушать, поэтому к моменту обратного подключения Xdebug listener уже готов.

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

Симптом Что делать
Команда отказывает курсор не внутри тестовой функции
«буфер не сохранён» сохраните файл
Мои точки останова игнорируются так и задумано — ставьте их в этой сессии
Запускается весь набор курсор был на строке группы, а не внутри теста
PHP ничего не делает в профиле нет testCommand