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

Отладка cargo test

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

Предпосылки

  • codelldb в PATH
  • профиль проекта — механизм отладки теста наследует из него всё, кроме программы

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

Дополнительной настройки не нужно. В Neovim поставьте курсор внутрь теста и:

:DebugTest

Либо из терминала, назвав место:

bugsaur gui --project . --test-at src/lib.rs:42

Bugsaur собирает тесты командой cargo test --no-run --message-format=json, берёт из вывода компилятора получившийся тестовый бинарник и отлаживает его с фильтром выбранного теста.

Адаптер, окружение и рабочий каталог приходят из профиля; подменяются только программа и её аргументы.

Два условия

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

Сохранённые точки останова не подхватываются. Запуск теста использует только точки текущего запроса — в отличие от :DebugStart.

Весь тестовый модуль

Поставьте курсор на строку группы — mod tests — и выполните ту же команду. Запустится вся группа вместо одного теста.

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

Годится, когда вы всегда отлаживаете один и тот же тестовый бинарник, например в условиях, близких к CI.

cargo test --no-run --message-format=json | grep executable

Возьмите напечатанный путь и направьте на него профиль:

[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 руками и прочитайте ошибку