Отладка теста под курсором¶
Поставьте курсор в тест, нажмите одну клавишу и окажитесь в отладчике. Ни профиля под каждый тест, ни фильтра руками.
Из редактора¶
по умолчанию <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 |