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

Ответ

В Go принят подход, при котором стандартная библиотека является основой для всего, включая тестирование. Однако для удобства и расширения возможностей используются сторонние библиотеки.

1. Стандартная библиотека testing

Это фундамент для любого вида тестирования в Go.

  • Юнит-тесты: Функции вида func TestMyFunction(t *testing.T) { ... }.
  • Бенчмарки: Функции вида func BenchmarkMyFunction(b *testing.B) { ... } для измерения производительности.
  • Примеры: Функции вида func ExampleMyFunction() { ... }, которые проверяются во время тестов и попадают в документацию.
  • Параллельное выполнение: t.Parallel() для ускорения тестов.

2. Table-Driven Tests (табличные тесты)

Это идиоматический паттерн в Go, а не библиотека. Он позволяет проверить множество входных и выходных данных в одном тесте, делая его чистым и расширяемым.

func TestAdd(t *testing.T) {
    testCases := []struct {
        name string
        a, b int
        want int
    }{
        {"positive", 2, 3, 5},
        {"negative", -1, -1, -2},
        {"zero", 5, 0, 5},
    }

    for _, tc := range testCases {
        t.Run(tc.name, func(t *testing.T) {
            got := Add(tc.a, tc.b)
            if got != tc.want {
                t.Errorf("Add(%d, %d) = %d; want %d", tc.a, tc.b, got, tc.want)
            }
        })
    }
}

3. Популярные сторонние библиотеки

  • Testify (github.com/stretchr/testify): Самая популярная библиотека для улучшения тестов.

    • assert: Предоставляет удобные функции для проверок (assert.Equal(t, expected, actual)). В случае ошибки тест помечается как проваленный, но выполнение продолжается.
    • require: Аналогичен assert, но в случае ошибки немедленно прерывает выполнение теста (t.FailNow()).
    • mock: Мощный инструмент для создания моков (заглушек) на основе интерфейсов.
    • suite: Позволяет группировать тесты в сьюты (наборы) с общими Setup и Teardown методами.

  • GoMock (go.uber.org/mock): Инструмент от Uber для генерации моков. Он генерирует код моков на основе ваших интерфейсов, что обеспечивает строгую типизацию.



  • httptest (из стандартной библиотеки): Незаменимый пакет для тестирования HTTP-хендлеров без реального запуска сервера. Он позволяет создавать фейковые запросы (httptest.NewRequest) и записывать ответы (httptest.NewRecorder).