Как запустить все тесты в проекте Go (go test) и не пропустить ни одного?
Основная команда и её нюансы
Для запуска всех тестов в проекте Go стандартная команда — go test ./.... Три точки означают "рекурсивно пройти по всем подпапкам". Однако, если команда выдаёт ошибки, это почти всегда связано с неправильной структурой проекта или именованием файлов.
Правильная структура и имена
В Go есть жёсткие правила:
- Тестовые файлы обязательно должны заканчиваться на
_test.go. Вашintegration_test.go— ок, но проверьте, что в папкеtests/нет других файлов без суффикса_test. - Функции тестов должны начинаться с
Test, напримерTestSum. - Пакет в тестовом файле должен совпадать с пакетом тестируемого кода, либо быть
package mainс суффиксом_test(для внешних тестов).
Почему go test ./... может не работать
Ошибки "cannot find package" или "no test files" возникают из-за:
- Файлы не входят в сборку. Если в папке
tests/лежитintegration_test.go, а рядом нет обычного.goфайла с тем же пакетом, Go не сможет скомпилировать тест. Решение: либо добавьте в папкуtests/файл с пакетом (например,package testsи пустую функцию), либо переместите интеграционные тесты в папку с основным кодом. - Несовместимость версий Go. Убедитесь, что
go.modуказывает правильную версию (например,go 1.21). - Циклические зависимости. Если пакеты импортируют друг друга по кругу, тесты не соберутся.
Пошаговое решение для вашей структуры
Сделайте так:
- Переименуйте папку
tests/вintegration/и внутри создайте файлintegration_test.goс пакетомintegrationилиmain_test. - Убедитесь, что в папке
integration/есть хотя бы один не-тестовый файл (пустой) с тем же пакетом, иначе Go проигнорирует папку. - Запускайте тесты из корня проекта командой:
go test ./...
Полезные флаги
-v— подробный вывод (каждый тест поимённо).-count=1— отключить кэширование (полезно для свежих результатов).-run ^TestName$— запустить конкретный тест по имени.-short— если вы написали поддержку коротких тестов в коде.
Пример полной команды для вашего случая:
go test -v -count=1 ./...
Что делать, если тесты всё равно не запускаются?
Проверьте:
- Нет ли в папках файлов с ошибками синтаксиса.
- Не используете ли вы
go testвнутри подпапки (тогда тесты выше не запустятся). - Не забыли ли вы выполнить
go mod tidyдля обновления зависимостей.
Если всё равно проблемы — временно удалите папку tests/ и запустите go test ./pkg/.... Если работает, значит проблема именно в папке с интеграционными тестами.
Альтернативный подход: Makefile или скрипты
Если вы часто путаетесь в командах или хотите автоматизировать запуск с разными флагами, создайте в корне проекта файл Makefile:
test:
go test -v -count=1 -race ./...
test-short:
go test -v -short ./...
test-coverage:
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
Теперь достаточно писать make test или make test-coverage. Это удобно для CI/CD и командной работы.
Ещё один вариант: go test с явным перечислением пакетов
Если структура проекта сложная и ./... не подходит, можно перечислить все пакеты вручную:
go test ./pkg/calc/... ./pkg/utils/... ./tests/...
Но это неудобно при добавлении новых пакетов.
Совет по интеграционным тестам
Для изоляции интеграционных тестов от юнит-тестов используйте теги сборки (build tags). Добавьте в начало файла integration_test.go строку:
//go:build integration
Тогда они будут запускаться только по команде:
go test -tags=integration ./...
Это позволит держать быстрые юнит-тесты отдельно от медленных интеграционных.