Avatar ·

Как запустить все тесты в проекте Go с помощью `go test`?

Всем привет! Я новичок в Go и пытаюсь разобраться с тестированием. У меня есть проект, в котором несколько пакетов, и в каждом есть свои тестовые файлы (например, `main_test.go`, `utils_test.go`, `api_test.go`). Я хочу запустить сразу все тесты во всём проекте одной командой, но не понимаю, как это сделать правильно. Пробовал разные варианты: `go test`, `go test ./...`, но результаты разные. Иногда тесты не запускаются вообще, иногда только в текущей директории. Вот пример структуры моего проекта: ``` myproject/ ├── main.go ├── main_test.go ├── utils/ │ ├── helpers.go │ └── helpers_test.go └── api/ ├── handlers.go └── handlers_test.go ``` Когда я нахожусь в корне проекта и пишу `go test`, запускаются только тесты из `main_test.go`, а тесты в подпапках `utils` и `api` игнорируются. Если я пишу `go test ./...`, то получаю ошибку: `go: no test files` для некоторых пакетов (например, для корневого пакета, если там нет тестов). Как правильно запустить все тесты? И что делать, если в каком-то пакете тестов нет, но я не хочу видеть ошибки? Буду благодарен за подробное объяснение с примерами. <<>>

Основной способ: команда go test ./...

Самый правильный и распространённый способ запустить все тесты во всём проекте (включая подпапки) — это использовать команду:

go test ./...

Символ ./... означает "текущая директория и все её поддиректории рекурсивно". Go автоматически найдёт все файлы, оканчивающиеся на _test.go, и выполнит их.

Почему возникает ошибка "no test files"?

Ошибка go: no test files появляется, когда Go находит пакет, в котором нет ни одного тестового файла. Например, если в корне проекта нет *_test.go, то команда go test ./... выведет предупреждение для этого пакета. Это не критично, но засоряет вывод.

Чтобы избежать этой ошибки, используйте флаг -count=1 (для принудительного запуска без кэширования) или просто игнорируйте её. Однако есть более элегантное решение — фильтрация пакетов с помощью go list:

go test $(go list ./... | grep -v /vendor/)

Но для новичков проще использовать:

go test ./... 2>/dev/null

Это скроет ошибки (но и другие сообщения тоже).

Дополнительные полезные флаги

  • -v — подробный вывод (показывает название каждого теста).
  • -run <pattern> — запуск только тестов, чьё имя соответствует регулярному выражению.
  • -count=1 — отключает кэширование результатов (полезно при разработке).
  • -cover — показывает процент покрытия кода тестами.
  • -short — запуск только "коротких" тестов (если вы пометили их как t.Short()).

Примеры использования

1. Запустить все тесты с подробным выводом:

go test -v ./...

2. Запустить только тесты, содержащие "Helper" в имени:

go test -v -run Helper ./...

3. Запустить тесты с отчётом о покрытии:

go test -cover ./...

4. Запустить тесты для конкретного пакета (например, utils):

go test ./utils/...

Что делать, если тесты не запускаются?

  • Убедитесь, что файлы названы по шаблону *_test.go.
  • Проверьте, что в тестовых файлах есть функции вида func TestXxx(t *testing.T).
  • Попробуйте очистить кэш: go clean -testcache.
  • Если используете модули (go.mod), убедитесь, что они корректно инициализированы.

Рекомендация для вашей структуры

Для вашего проекта команда будет такой:

go test -v -count=1 ./...

Она запустит тесты в корне, utils и api. Если в корне нет тестов, просто проигнорируйте сообщение об ошибке — это нормально.

<<>>

Альтернативный подход: Makefile или скрипты

Если вы часто запускаете тесты и хотите избежать длинных команд, создайте Makefile в корне проекта:

# Makefile
.PHONY: test
test:
    go test -v -count=1 ./...

Теперь достаточно набрать make test.

Использование go test -list

Если нужно только посмотреть, какие тесты есть во всех пакетах, но не запускать их:

go test -list . ./...

Запуск тестов с параллелизмом

Go автоматически запускает тесты в разных пакетах параллельно. Если нужно ограничить количество параллельных процессов (например, из-за ресурсов), используйте флаг -p:

go test -p 2 ./...

Это запустит не более 2 тестовых пакетов одновременно.

Ошибка "package is not in GOROOT"

Если вы видите эту ошибку, значит вы не используете модули. Инициализируйте модуль:

go mod init myproject

После этого команда go test ./... будет работать корректно.

Заключение

Самый надёжный вариант для новичка — go test -v ./.... Он запустит все тесты во всех подпакетах и покажет детали. Ошибки типа "no test files" — это не проблема, просто Go сообщает, что в некоторых папках нет тестов. Со временем вы привыкнете к этому.