Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Методы запуска конкретных тестов в Go
Основные способы запуска тестов
В Go существует несколько эффективных способов запуска конкретных тестов, которые позволяют оптимизировать процесс разработки и отладки.
1. Запуск тестов конкретного пакета
Для запуска всех тестов в текущем пакете используйте стандартную команду:
go test
Для запуска тестов в конкретном пакете:
go test ./mypackage
go test github.com/user/project/mypackage
2. Запуск конкретной тестовой функции
Для запуска определенной тестовой функции используйте флаг -run с регулярным выражением:
go test -run TestFunctionName
go test -run "^TestMyFunction$" # точное совпадение
Например, если у вас есть функция TestCalculateTotal:
func TestCalculateTotal(t *testing.T) {
// тестовый код
}
Запустить ее можно так:
go test -run TestCalculateTotal
3. Запуск группы тестов
Флаг -run поддерживает регулярные выражения, что позволяет запускать группы тестов:
go test -run "TestCalculate.*" # все тесты, начинающиеся с TestCalculate
go test -run "Test.*Integration" # все интеграционные тесты
go test -run "Test.*/v[12]" # тесты с определенным суффиксом
4. Запуск тестов с подтестами (subtests)
Для Go 1.7+ с поддержкой subtests, можно запускать конкретные подтесты:
func TestUserOperations(t *testing.T) {
t.Run("CreateUser", func(t *testing.T) {
// тест создания пользователя
})
t.Run("DeleteUser", func(t *testing.T) {
// тест удаления пользователя
})
}
Запуск конкретного подтеста:
go test -run "TestUserOperations/CreateUser"
go test -run "TestUserOperations/.*" # все подтесты TestUserOperations
5. Запуск примеров (Examples)
Примеры кода, которые также являются тестами, можно запускать аналогично:
go test -run ExampleFunctionName
Полезные флаги и комбинации
Параллельный запуск тестов
go test -parallel 4 -run "Test.*" # запуск 4 тестов параллельно
Пропуск кэширования
go test -count=1 -run TestSpecificFunction
Флаг -count=1 отключает кэширование результатов тестов, что полезно при отладке.
Подробный вывод
go test -v -run TestFunctionName # подробный вывод
Запуск тестов с таймаутом
go test -timeout 30s -run TestLongRunningFunction
Продвинутые сценарии
Запуск тестов по тегам (build tags)
go test -tags integration -run "Test.*"
В коде теста:
//go:build integration
// +build integration
package mypackage
func TestIntegrationScenario(t *testing.T) {
// интеграционный тест
}
Использование makefile или скриптов
Для сложных сценариев можно создать Makefile:
test-unit:
go test -run "Test.*" ./...
test-integration:
go test -tags integration ./...
test-specific:
go test -run $(TEST_NAME) ./...
Запуск:
make test-specific TEST_NAME="TestCalculateTotal"
Запуск из IDE
В популярных IDE запуск тестов упрощен:
- VS Code: Правый клик на функции теста → "Run Test"
- Goland: Зеленая стрелка рядом с функцией теста
- IntelliJ IDEA: Аналогично GoLand
Практические рекомендации
- Именование тестов: Используйте осмысленные имена, группируйте тесты по префиксам (
TestUnit_,TestIntegration_,TestBenchmark_) - Организация тестов: Разделяйте unit-тесты и интеграционные тесты по разным пакетам или используйте build tags
- Использование табличных тестов: Упрощает запуск конкретных тестовых случаев
- Кэширование результатов: Go автоматически кэширует результаты успешных тестов, используйте
-count=1для принудительного перезапуска
Пример комплексного использования
Предположим, у нас есть структура тестов:
func TestUser(t *testing.T) {
t.Run("Create/Valid", func(t *testing.T) { /* ... */ })
t.Run("Create/InvalidEmail", func(t *testing.T) { /* ... */ })
t.Run("Delete/Existing", func(t *testing.T) { /* ... */ })
}
func TestProduct(t *testing.T) {
t.Run("Add/Simple", func(t *testing.T) { /* ... */ })
t.Run("Add/WithDiscount", func(t *testing.T) { /* ... */ })
}
Запуск конкретных сценариев:
# Только тесты создания пользователей
go test -v -run "TestUser/Create"
# Конкретный тест с отключением кэша
go test -v -count=1 -run "TestUser/Create/InvalidEmail"
# Все тесты пользователей и продуктов
go test -v -run "Test(User|Product)"
Выбор метода запуска зависит от конкретной ситуации: для быстрой отладки подойдет запуск конкретной функции, для CI/CD — более комплексные команды с учетом тегов и параллельного выполнения.