Ответ
В Go существует мощная встроенная поддержка тестирования, дополненная популярными сторонними библиотеками.
1. Стандартная библиотека testing
Это основа для всех видов тестов в Go.
- Юнит-тесты: Файлы
_test.goи функции видаfunc TestMyFunction(t *testing.T). Часто используется паттерн table-driven tests для проверки функции на множестве входных данных. - Бенчмарки: Функции вида
func BenchmarkMyFunction(b *testing.B)для измерения производительности кода. - Примеры: Функции вида
func ExampleMyFunction()для демонстрации использования API, которые также проверяются во время тестов.
2. Популярные сторонние библиотеки
-
testify/assertиtestify/requireПредоставляют более удобные и читаемые функции для проверок (assertions).assertпродолжает выполнение теста после ошибки, аrequireнемедленно его останавливает.import ( "testing" "github.com/stretchr/testify/assert" ) func TestAdd(t *testing.T) { result := Add(2, 3) // Проверка на равенство assert.Equal(t, 5, result, "Сумма должна быть равна 5") } -
testify/mockиgomockИнструменты для создания моков (mock objects) — заглушек для зависимостей (например, баз данных или внешних API).testify/mockтребует ручного написания моков, аgomockот Google умеет генерировать их на основе интерфейсов. -
net/http/httptestПакет из стандартной библиотеки, незаменимый для тестирования HTTP-хендлеров без запуска реального веб-сервера. Он позволяет создавать фейковые запросы (httptest.NewRequest) и записывать ответы (httptest.NewRecorder).
Ответ 18+ 🔞
Ну, смотри, в Го тестирование — это не просто какая-то хуета на отъебись, там реально всё продумано, прямо из коробки. Как будто тебе в комплекте сразу дали и молоток, и гвозди, и даже инструкцию, где не надо гадать на кофейной гуще.
1. Родной, мать его, testing пакет
Это база, фундамент, без которого нихуя не построишь. Всё крутится вокруг него.
- Обычные тесты (юниты): Создаёшь файл
_test.go, пишешь функциюfunc TestМояФункция(t *testing.T). И чтобы не писать тонну однообразного кода, умные люди придумали table-driven tests — загоняешь кучу примеров "вход-ожидаемый выход" в слайс и одним циклом всё прогоняешь. Элегантно, блядь. - Замер скорости (бенчмарки): Функции вида
func BenchmarkМояФункция(b *testing.B). Запустил — и он тебе покажет, не сосёт ли твой алгоритм как пылесос, а работает шустро. - Примеры (examples): Функции
func ExampleМояФункция(). Это такая хитрая жопа: и документация живая, и заодно проверяется, что пример-то рабочий. Два зайца, ёпта.
2. Сторонние приблуды, без которых многие жить не могут
-
testify/assertиtestify/requireЭто когда надоело каждый раз писатьif got != want { t.Errorf(...) }. Тут тебе дают кучу готовых проверок: "равно", "содержит", "не nil" и прочую хуйню.assert— если проверка провалилась, тест продолжит бежать, чтобы найти все косяки. Аrequire— сразу пиздец, стоп-кран, дальше не идём. Выбирай по характеру.import ( "testing" "github.com/stretchr/testify/assert" ) func TestAdd(t *testing.T) { result := Add(2, 3) // Проверка на равенство assert.Equal(t, 5, result, "Сумма должна быть равна 5") } -
testify/mockиgomockВот это уже для взрослых. Когда твой код общается с базой данных или каким-нибудь внешним API, а тебе надо проверить логику, а не то, жива ли база. Моки — это такие подставные утки, которые делают вид, что они база данных.testify/mock— пишешь структуру-заглушку сам, руками.gomockот Гугла — ты описываешь интерфейс, а он тебе на его основе код мока генерирует, волшебство, блядь. Выбор за тобой: или потратить время один раз на написание, или потратить время на изучение генератора. -
net/http/httptestА это вообще жемчужина из стандартной библиотеки! Тебе не нужно поднимать целый веб-сервер, чтобы потестить хендлер. Всё делается в памяти, быстро и чисто. Создаёшь фейковый запрос (httptest.NewRequest), подсовываешь его своему хендлеру, а ответ ловишь в специальный рекордер (httptest.NewRecorder). Всё, можно проверять статус-коды, заголовки, тело ответа. Удобство — овердохуища, честно.