Какие подходы и инструменты для тестирования применяются в Go?

Ответ

В Go тестирование является неотъемлемой частью экосистемы и поддерживается стандартной библиотекой. Основные подходы:

  1. Unit-тесты. Используется стандартный пакет testing. Тесты находятся в файлах _test.go и запускаются командой go test.

    • Табличные тесты (Table-Driven Tests) — это идиоматичный способ для Go, позволяющий проверить множество входных данных и ожидаемых результатов в одном тесте.
    func TestAdd(t *testing.T) {
        cases := []struct {
            name     string
            a, b     int
            expected int
        }{
            {"positive numbers", 2, 3, 5},
            {"negative numbers", -2, -3, -5},
            {"zero", 5, 0, 5},
        }
    
        for _, tc := range cases {
            t.Run(tc.name, func(t *testing.T) {
                result := Add(tc.a, tc.b)
                if result != tc.expected {
                    t.Errorf("Add(%d, %d) = %d; want %d", tc.a, tc.b, result, tc.expected)
                }
            })
        }
    }
  2. Интеграционные тесты. Проверяют взаимодействие нескольких компонентов системы (например, сервис и база данных). Для изоляции часто используют:

    • Docker-контейнеры: с помощью библиотек вроде testcontainers-go можно поднять в тесте временную БД или другую зависимость.
  3. Моки и стабы (Mocks & Stubs). Для изоляции тестируемого кода от внешних зависимостей (API, БД) используются моки. В Go это легко реализуется через интерфейсы. Популярная библиотека — testify/mock.

  4. Бенчмарки. Пакет testing также позволяет писать тесты производительности (бенчмарки) с помощью testing.B для измерения скорости выполнения кода и количества аллокаций.

  5. CI/CD. Все тесты интегрируются в пайплайны CI/CD (например, GitHub Actions, GitLab CI) для автоматического запуска при каждом коммите или перед слиянием веток, что обеспечивает стабильность кодовой базы.