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

Ответ

В 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). Всё, можно проверять статус-коды, заголовки, тело ответа. Удобство — овердохуища, честно.