Top.Mail.Ru
kata academy

Фреймворки для тестирования на Go: сравнение Testify, Ginkgo и других

Анализ популярных фреймворков для тестирования на Go

Время чтения: 3 минуты
Хочешь кодить как босс?
Заполняй форму и начни свой путь в IT прямо сейчас!
Зачем нужны фреймворки для тестирования на Go? Стандартный пакет testing вполне функционален, но его можно дополнить более выразительными фреймворками, особенно когда речь идёт о проектах с развитыми зависимостями или сложной логикой.

Мы сравним четыре популярных фреймворка: Testify, Ginkgo, GoMock и GoConvey. Рассмотрим их возможности, стиль тестирования, поддержку моков, а также приведём примеры тестов.
Что такое TDD и BDD?
Перед сравнением фреймворков важно понять два ключевых подхода к тестированию:

  • TDD (Test-Driven Development) — разработка через тестирование. Сначала пишется тест, который не проходит, затем пишется минимальный код, чтобы тест прошёл, и только потом происходит рефакторинг кода. Это помогает проектировать API, улучшать архитектуру и избегать багов ещё до написания основной логики.
  • BDD (Behavior-Driven Development) — развитие TDD, ориентированное на поведение системы. Тесты пишутся в виде сценариев, описывающих, что должно происходить при определённых условиях. Это делает тесты более читаемыми для разработчиков, аналитиков и QA-инженеров.
Примеры использования в коде

  • TDD:
func TestLogin(t *testing.T) {
assert.True(t, IsValidLogin("user", "pass"))
}

  • BDD (Ginkgo):
Describe("Login process", func() {
It("should accept valid credentials", func() {
Expect(IsValidLogin("user", "pass")).To(BeTrue())
})
})
IT-калькулятор зарплат
Узнай свою рыночную зарплату за 1 минуту!
Что такое моки?
Еще один термин, который важно пояснить перед анализом фреймворков — моки.

Моки (mocks) — это тестовые заменители настоящих зависимостей, которые позволяют изолировать поведение кода при тестировании. Представь, что у тебя есть функция, которая делает HTTP-запрос или обращается к базе данных. Чтобы не вызывать настоящий сервер или не трогать базу во время теста, ты создаёшь мок, который притворяется этим внешним сервисом, но возвращает предсказуемые результаты.

У тебя есть интерфейс:
type Notifier interface {
Send(message string) error
}

А в тесте ты не хочешь реально отправлять сообщения, поэтому создаёшь мок:
type MockNotifier struct{}
func (m *MockNotifier) Send(message string) error {
return nil // всегда "успешно"
}

Затем подставляешь его в код, и тестируешь без зависимости от реального внешнего ресурса.
Популярные фреймворки
Testify
Testify — один из самых популярных и удобных фреймворков для тестирования на Go, стиль TDD, не поддерживает BDD или контекстную структуру. Он предоставляет набор пакетов: assert, require для проверок, и mock для создания моков. Прост в освоении и подходит для повседневных задач. Доступен через GitHub и go get.

Особенности
  • Простые и читаемые assert и require для проверки условий
  • Встроенная поддержка моков через mock.Mock с ограниченной функциональностью: testify/mock подходит для простых интерфейсов, но не покрывает сложные сценарии (в отличие от GoMock).
  • Идеально интегрируется со стандартным testing.T
  • Подходит как для юнит-, так и для интеграционных тестов
В каких проектах используется?
  • REST API (Gin, Echo)
  • CLI-инструменты
  • Библиотеки с бизнес-логикой
  • Проекты, где важны скорость и читаемость тестов
Импорт в коде для старта
import (
"testing"
"github.com/stretchr/testify/assert"
)
Пример использования
func TestSum(t *testing.T) {
result := Sum(2, 3)
assert.Equal(t, 5, result)
}
Читать про IT — здорово, но ещё лучше работать в IT. В Kata Academy тебя ждёт обучение с гарантией трудоустройства и поддержкой личного ментора. Выбирай удобный формат платежей: плати вперед или вноси основную часть оплаты после трудоустройства!
Ginkgo + Gomega
Ginkgo — мощный фреймворк для тестирования в стиле BDD. Вместе с библиотекой для написания утверждений Gomega он предоставляет выразительный синтаксис для описания сложного поведения системы. Широко используется в Kubernetes-проектах. Устанавливается через GitHub. Отметим, что последняя версия — Ginkgo v2 несовместима по API с первой версией.

Особенности
  • Поддержка структур Describe, Context, It, BeforeEach и других
  • Возможность писать выразительные тесты, описывающие поведение
  • Ginkgo сам не предоставляет средства для мокирования, но отлично сочетается с GoMock и Testify
  • Поддержка параллельного выполнения тестов
  • Поддерживает рераны упавших тестов (повторный запуск), декларативные теги, аннотации
  • Может быть сложно интегрировать в CI, если команда не использует BDD активно
  • Для простых тестов может быть избыточен
В каких проектах используется?
  • Сложные бизнес-приложения
  • Инфраструктурные проекты
  • Kubernetes-операторы (официально используется в проектах CNCF)
  • Когда тесты — часть документации поведения системы
Импорт в коде для старта
import (
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
"testing"
)

Пример использования
var _ = Describe("Math", func() {
It("adds two numbers", func() {
Expect(Sum(2, 3)).To(Equal(5))
})
})
GoMock
GoMock — официальный инструмент от Google для создания моков в Go. Используется вместе с mockgen — утилитой для генерации кода. Стиль тестирования TDD. Устанавливается через go install.

Особенности
  • Генерация моков на основе интерфейсов
  • Очень хорош для контрактного тестирования
  • Не поддерживает генерацию моков «на лету» — требуется запуск mockgen, то есть отдельного этапа сборки
  • Установка ожиданий (EXPECT()) и проверка вызовов
  • Подходит для сложных сценариев, где важна точность взаимодействий
В каких проектах используется?
  • Архитектуры с чётким разделением интерфейсов (чистая архитектура)
  • Системы с большим количеством внешних зависимостей
  • Банковские, страховые и другие чувствительные системы
Пример генерации
mockgen -source=service.go -destination=mocks/service_mock.go -package=mocks

Пример использования
mockSvc.EXPECT().DoSomething().Return(nil)
GoConvey
GoConvey — фреймворк с визуальным интерфейсом и поддержкой BDD-подхода. При запуске тестов открывает локальный веб-сервер, где отображается статус тестов в реальном времени. GoConvey не содержит собственных средств мокирования. Для использования моков необходимо реализовывать интерфейсы вручную или использовать сторонние библиотеки (например, Testify или GoMock).

Особенности
  • BDD-стиль с вложенными Convey-блоками
  • Автоматический перезапуск тестов при изменении файлов
  • Удобный пользовательский интферфейс в браузере
  • Интеграция с testing.T
  • Интерфейс работает только локально и не всегда стабилен в CI
В каких проектах используется?
  • Pet-проекты
  • Учебные и демонстрационные приложения
  • Локальная разработка, когда важен UI-фидбек
Импорт в коде для старта
import (
"testing"
. "github.com/smartystreets/goconvey/convey"
)

Пример использования
Convey("Sum of two numbers", t, func() {
So(Sum(2, 3), ShouldEqual, 5)
})
Какой фреймворк выбрать?
Testify — лучший выбор для большинства повседневных задач. Прост, эффективен, с поддержкой моков и читаемыми проверками.

Ginkgo — идеален для описания поведения, сложных тест-кейсов и сценариев, где важна документация в тестах.

GoMock — когда критична изоляция, строгие интерфейсы и детальный контроль над вызовами.

GoConvey — для визуальной обратной связи, обучения и лёгкой BDD-структуры тестов, особенно в pet-проектах.
Хочешь разобраться в тестировании на профессиональном уровне и устроиться на работу QA-инженером? Приглашаем тебя на курс с гарантией трудоустройства. Всего за 5 месяцев ты освоишь профессию с нуля, обучение пройдет с поддержкой личного ментора и hr-консультанта, мы подготовим тебя к собеседованиям и будем рядом до получения оффера! Оплатить курс можно сразу или внести основную часть оплаты уже после выхода на работу. Узнай подробнее по ссылке.

Статьи для старта в IT

Истории наших выпускников

Стань тем, кто задаёт тон в IT!
Подпишись на нашу рассылку и первым получай статьи по Java, JavaScript, Golang и QA. Позволь себе быть экспертом!