Тестирование в Go (Golang): фреймворки и инструменты

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Тестирование в Go (Golang): фреймворки и инструменты

Go (Golang) с самого начала проектировался с учётом потребностей современной разработки, поэтому в стандартной библиотеке уже есть мощный пакет testing. Однако для сложных проектов часто требуются дополнительные инструменты: моки, утверждения (assertions), BDD-стиль и проверка утечек горутин. В этой статье мы разберём основные фреймворки и библиотеки для тестирования в Go, покажем примеры кода и объясним, когда что использовать.

1. Встроенный пакет testing

Стандартный пакет testing — основа всего. Тесты пишутся в файлах с суффиксом _test.go, а функции должны иметь сигнатуру func TestXxx(t *testing.T). Пример:

package main

import (
    "testing"
)

func Sum(a, b int) int {
    return a + b
}

func TestSum(t *testing.T) {
    result := Sum(2, 3)
    expected := 5
    if result != expected {
        t.Errorf("Sum(2,3) = %d; want %d", result, expected)
    }
}

Запуск тестов: go test ./.... Для бенчмарков используется testing.B, для примеров — ExampleXxx.

2. Библиотека testify

Testify — самая популярная сторонняя библиотека для тестирования в Go. Она предоставляет удобные ассерты (утверждения), моки и вспомогательные функции.

Установка:

go get github.com/stretchr/testify

Пример с ассертами:

package main

import (
    "testing"
    "github.com/stretchr/testify/assert"
)

func TestSumWithTestify(t *testing.T) {
    result := Sum(2, 3)
    assert.Equal(t, 5, result, "Sum should be 5")
    assert.NotEqual(t, 0, result)
    assert.True(t, result > 0)
}

Testify также включает пакет mock для создания моков. Пример:

package main

import (
    "testing"
    "github.com/stretchr/testify/mock"
)

// DataService — интерфейс, который мы будем мокать
type DataService interface {
    GetData(id int) string
}

// MockDataService — мок-структура
type MockDataService struct {
    mock.Mock
}

func (m *MockDataService) GetData(id int) string {
    args := m.Called(id)
    return args.String(0)
}

func TestGetData(t *testing.T) {
    mockService := new(MockDataService)
    mockService.On("GetData", 1).Return("result1")

    result := mockService.GetData(1)
    assert.Equal(t, "result1", result)
    mockService.AssertExpectations(t)
}

3. gomock — генерация моков

Gomock от Google — фреймворк для генерации моков на основе интерфейсов. Работает через утилиту mockgen.

Установка:

go install github.com/golang/mock/mockgen@v1.6.0

Пример использования:

//go:generate mockgen -source=service.go -destination=mock_service.go -package=main

type Service interface {
    Process(data string) error
}

// В тесте:
func TestProcess(t *testing.T) {
    ctrl := gomock.NewController(t)
    defer ctrl.Finish()

    mockService := NewMockService(ctrl)
    mockService.EXPECT().Process("test").Return(nil)

    err := mockService.Process("test")
    assert.NoError(t, err)
}

Gomock хорош для больших проектов, где много интерфейсов — генерация кода экономит время.

4. ginkgo — BDD-стиль

Ginkgo — фреймворк для Behaviour-Driven Development (BDD). Позволяет писать тесты в стиле "описания" (Describe), "контекста" (Context) и "спецификации" (It).

Установка:

go get github.com/onsi/ginkgo/v2
go get github.com/onsi/gomega

Пример:

package main

import (
    . "github.com/onsi/ginkgo/v2"
    . "github.com/onsi/gomega"
    "testing"
)

func TestCalculator(t *testing.T) {
    RegisterFailHandler(Fail)
    RunSpecs(t, "Calculator Suite")
}

var _ = Describe("Calculator", func() {
    Context("when adding two numbers", func() {
        It("should return the sum", func() {
            result := Sum(2, 3)
            Expect(result).To(Equal(5))
        })
    })
})

Ginkgo отлично подходит для больших интеграционных тестов и проектов, где важна читаем

Рекомендаций