Отладка cargo test¶
Остановиться внутри теста на Rust.
Предпосылки¶
codelldbвPATH- профиль проекта — механизм отладки теста наследует из него всё, кроме программы
Короткий путь: тест под курсором¶
Дополнительной настройки не нужно. В Neovim поставьте курсор внутрь теста и:
Либо из терминала, назвав место:
Bugsaur собирает тесты командой
cargo test --no-run --message-format=json, берёт из вывода компилятора
получившийся тестовый бинарник и отлаживает его с фильтром выбранного теста.
Адаптер, окружение и рабочий каталог приходят из профиля; подменяются только программа и её аргументы.
Два условия
Буфер должен быть сохранён. Бэкенд читает файл с диска и не может сопоставить несохранённый текст с собранным бинарником.
Сохранённые точки останова не подхватываются. Запуск теста использует
только точки текущего запроса — в отличие от :DebugStart.
Весь тестовый модуль¶
Поставьте курсор на строку группы — mod tests — и выполните ту же команду.
Запустится вся группа вместо одного теста.
Длинный путь: отдельный профиль¶
Годится, когда вы всегда отлаживаете один и тот же тестовый бинарник, например в условиях, близких к CI.
Возьмите напечатанный путь и направьте на него профиль:
[profiles.lib-tests]
adapter = "codelldb"
program = "target/debug/deps/mycrate-1a2b3c4d5e6f"
args = ["my_test_name", "--exact", "--nocapture"]
Хеш в имени файла меняется
В имени тестового бинарника есть хеш сборки, и он меняется при пересборке крейта. Ровно поэтому и существует отладка теста под курсором: она перечитывает путь у компилятора на каждом запуске.
Частые настройки для тестов¶
Тесты, читающие testdata/¶
cargo test запускает бинарник из каталога пакета. Под отладчиком рабочий
каталог — корень проекта, поэтому относительные пути расходятся:
[profiles.lib-tests]
adapter = "codelldb"
program = "target/debug/deps/mycrate-1a2b3c4d5e6f"
cwd = "crates/mycrate"
Как увидеть вывод теста¶
Rust прячет вывод прошедших тестов. --nocapture в args показывает его в
панели Logs в категории Program.
Если не работает¶
| Симптом | Что делать |
|---|---|
:DebugTest отказывает |
курсор не внутри тестовой функции; строка #[test] тоже годится |
| «буфер не сохранён» | сохраните файл |
| Точки останова игнорируются | так и задумано — запуск теста берёт только точки этого запроса |
| Останавливается не в том тесте | фильтр совпал с несколькими; уточните имя |
| Ничего не собирается | выполните cargo test --no-run руками и прочитайте ошибку |