Ответ
Тестирование — это встроенная и первоклассная возможность языка Go, для которой используется стандартный пакет testing и утилита go test.
Основные правила:
- Тесты находятся в файлах с суффиксом
_test.go. - Тестовые файлы располагаются в том же пакете, что и тестируемый код.
- Тестовая функция должна начинаться с
Test, принимать один аргументt *testing.Tи не возвращать значений.
1. Простой юнит-тест:
// В файле sum.go
func Sum(a, b int) int {
return a + b
}
// В файле sum_test.go
func TestSum(t *testing.T) {
got := Sum(2, 3)
want := 5
if got != want {
t.Errorf("Sum(2, 3) = %d; want %d", got, want)
}
}2. Табличные тесты (Table-Driven Tests):
Это идиоматичный и предпочтительный способ для проверки множества кейсов. Для изоляции тестов и более четкого вывода используется t.Run().
func TestSumTable(t *testing.T) {
tests := []struct {
name string // Имя под-теста
a int
b int
want int
}{
{"positive numbers", 1, 2, 3},
{"zeroes", 0, 0, 0},
{"negative and positive", -1, 1, 0},
{"negative numbers", -2, -3, -5},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := Sum(tt.a, tt.b)
if got != tt.want {
t.Errorf("Sum(%d, %d) = %d; want %d", tt.a, tt.b, got, tt.want)
}
})
}
}3. Бенчмарки (Benchmarks):
Для измерения производительности. Функция должна начинаться с Benchmark и принимать *testing.B.
func BenchmarkSum(b *testing.B) {
// b.N - это количество итераций, которое определяет сам фреймворк
for i := 0; i < b.N; i++ {
Sum(100, 200)
}
}Запуск тестов:
go test: запуск всех тестов в текущем пакете.go test -v: запуск с подробным выводом, включая имена запущенных тестов.go test ./...: запуск тестов во всех под-пакетах.go test -run TestSumTable/zeroes: запуск конкретного под-теста.go test -cover: показать покрытие кода тестами.go test -bench .: запуск всех бенчмарков.