Тестирование в 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 отлично подходит для больших интеграционных тестов и проектов, где важна читаем
Также в библиотеке
ts-node-dev для TypeScript: полное руководство с примерами
Криптография в Kotlin: шифрование и хеширование с примерами
CoreLocation для Swift: полное руководство с примерами