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

Отладка тестов Go

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

Предпосылки

  • dlv в PATHcommand -v dlv
  • модуль Go

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

:DebugTest

или

bugsaur gui --project . --test-at internal/orders/order_test.go:31

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

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

Длинный путь: профиль тестов пакета

Годится, когда вы регулярно отлаживаете весь набор тестов пакета.

[profiles.orders-test]
adapter = "dlv"
program = "internal/orders"
# `go test` запускает бинарник из каталога пакета — без этой строки
# `testdata/` не найдётся, потому что по умолчанию cwd — корень проекта.
cwd = "internal/orders"

[profiles.orders-test.launch_arguments]
mode = "test"
bugsaur gui --project . --profile orders-test --break internal/orders/order.go:42

mode = \"test\" отключает сборку со стороны Bugsaur

Обычно Go компилирует сам Bugsaur и отдаёт Delve готовый бинарник. Когда профиль называет mode в launch_arguments, значит запуск ведут руками: Delve собирает тестовый бинарник сам, и наша сборка подложила бы ему не тот файл.

Запустить один тест из профиля

Передайте стандартный фильтр go test:

[profiles.orders-test.launch_arguments]
mode = "test"
args = ["-test.run", "TestCreateOrder$", "-test.v"]

Символ $ закрепляет конец шаблона; без него TestCreateOrder совпадёт и с TestCreateOrderFails.

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

Симптом Что делать
Не находится testdata/ задайте cwd каталогом пакета
Запускается весь набор, а не один тест добавьте -test.run с закреплённым шаблоном
Сессия падает с выводом компилятора тесты не компилируются; текст в панели Logs
Сессия не стартует dlv не виден через PATHАдаптер не запускается
Точки останова на странных строках в своей сборке не отключена оптимизация — оставьте -gcflags=all=-N -l
Тысячи потоков это горутины — Потоки