Тестирование в Go: testing пакет, benchmarks, coverage
Вопрос
Как организовано тестирование в Go? Что такое table-driven tests? Как писать бенчмарки и измерять покрытие?
Ответ
Тестирование в Go: - Встроенный пакет testing - Файлы *_test.go - Функции Test*, Benchmark*, Example* - Table-driven tests для множества тест-кейсов Типы тестов: - Unit tests - testing.T - Benchmarks - testing.B - Examples - проверяют output в комментариях
func TestAdd(t *testing.T) {
tests := []struct {
name string
a, b int
want int
}{
{"positive", 2, 3, 5},
{"negative", -1, 1, 0},
{"zero", 0, 0, 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Add(tt.a, tt.b); got != tt.want {
t.Errorf("Add(%d, %d) = %d, want %d",
tt.a, tt.b, got, tt.want)
}
})
}
}
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(1, 2)
}
}
func TestAdd(t *testing.T) {
tests := []struct {
name string
a, b int
want int
}{
{"positive", 2, 3, 5},
{"negative", -1, 1, 0},
{"zero", 0, 0, 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Add(tt.a, tt.b); got != tt.want {
t.Errorf("Add(%d, %d) = %d, want %d",
tt.a, tt.b, got, tt.want)
}
})
}
}
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(1, 2)
}
}
Дополнительные вопросы
Как тестировать HTTP handlers? Что такое testify и стоит ли его использовать?