Тестирование в Go: testing пакет, benchmarks, coverage

К вопросам
Средний
Testing

Вопрос

Как организовано тестирование в 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 и стоит ли его использовать?