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

Ответ

Тестирование HTTP API — ключевая часть бэкенд-разработки. Для этого в Go и смежных областях применяют несколько подходов и инструментов, которые можно разделить на три основные категории:

1. Стандартная библиотека Go (net/http/httptest)

Это основной способ для написания автоматических unit- и интеграционных тестов внутри вашего Go-проекта. Пакет httptest позволяет имитировать HTTP-запросы и записывать ответы без реального сетевого взаимодействия.

  • httptest.NewRecorder: Записывает ответ от вашего хендлера.
  • httptest.NewRequest: Создает мок-запрос для передачи в хендлер.

Пример теста для HTTP-хендлера:

// handler_test.go
package main

import (
    "io"
    "net/http"
    "net/http/httptest"
    "testing"
)

// Тестируемый хендлер
func MyHandler(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("OK"))
}

func TestMyHandler(t *testing.T) {
    // Создаем мок-запрос
    req := httptest.NewRequest(http.MethodGet, "/", nil)

    // Создаем рекордер для записи ответа
    w := httptest.NewRecorder()

    // Вызываем хендлер
    MyHandler(w, req)

    // Получаем результат
    resp := w.Result()
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)

    // Проверяем статус-код и тело ответа
    if resp.StatusCode != http.StatusOK {
        t.Errorf("expected status %d; got %d", http.StatusOK, resp.StatusCode)
    }
    if string(body) != "OK" {
        t.Errorf("expected body 'OK'; got '%s'", string(body))
    }
}

2. Утилиты командной строки (CLI)

Используются для быстрой ручной проверки эндпоинтов, написания скриптов и интеграции в CI/CD.

  • curl: Стандарт де-факто для выполнения HTTP-запросов из терминала. Гибкий и мощный инструмент.
  • httpie: Более современная и user-friendly альтернатива curl с подсветкой синтаксиса и более простым интерфейсом.

3. Графические клиенты (GUI)

Идеальны для ручного тестирования, исследования API, создания коллекций запросов и совместной работы в команде.

  • Postman: Самый популярный инструмент. Позволяет создавать сложные запросы, управлять окружениями (dev, prod), писать тесты на JavaScript и создавать документацию.
  • Insomnia: Прямой конкурент Postman, ценится за более чистый интерфейс и хорошую поддержку GraphQL.

Ответ 18+ 🔞

Да ты посмотри, какие у нас тут инструменты для проверки этих ваших API! Прямо как в магазине — на любой вкус и цвет, от голого стандарта до навороченных графических штук. Сейчас разложу всё по полочкам, чтобы даже мартышлюшка с винтом в голове разобралась.

1. Стандартная библиотека — наш родной net/http/httptest

Это, блядь, наш фундамент, наш кирпич в жопу всем проблемам. Когда пишешь тесты прямо в коде, чтобы не выёбываться с запуском сервера. Всё происходит в памяти, быстро, как хуй с горы.

  • httptest.NewRecorder: Это такой подставной мужик, который всё записывает, что твой хендлер ему в ответ плюнет.
  • httptest.NewRequest: А это фальшивая бумажка-запрос, которую ты этому хендлеру суёшь.

Смотри, как это выглядит на практике, ёпта:

// handler_test.go
package main

import (
    "io"
    "net/http"
    "net/http/httptest"
    "testing"
)

// Хендлер, который будем мучать
func MyHandler(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("OK"))
}

func TestMyHandler(t *testing.T) {
    // Лепим фейковый запрос
    req := httptest.NewRequest(http.MethodGet, "/", nil)

    // Ставим подсадную утку-рекордер
    w := httptest.NewRecorder()

    // Дёргаем хендлер
    MyHandler(w, req)

    // Достаём результат
    resp := w.Result()
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)

    // А теперь проверяем, не обосрался ли он
    if resp.StatusCode != http.StatusOK {
        t.Errorf("expected status %d; got %d", http.StatusOK, resp.StatusCode)
    }
    if string(body) != "OK" {
        t.Errorf("expected body 'OK'; got '%s'", string(body))
    }
}

Вот и весь фокус. Никаких портов, никаких сетей — чистая магия и скорость.

2. Консольные утилиты — для быстрых наскоков

Когда надо быстро ткнуть палкой в работающий сервис из терминала, чтобы понять, жив ли он ещё или уже накрылся медным тазом.

  • curl: Старый, добрый, волосатый дед. Сделает всё, что угодно, но команды у него такие, что глаза сломаешь. -X POST -H "Content-Type: application/json" -d '{"foo":"bar"}' — обычное дело.
  • httpie: Молодой и дерзкий. Тот же функционал, но команды человеческим языком. Тот же запрос будет выглядеть как http POST example.com foo=bar. Красота, блядь!

3. Графические штуки — для красоты и порядка

А это уже для ленивых, как я, или для командной работы, когда надо не просто ткнуть, а всё красиво оформить, сохранить и похвастаться.

  • Postman: Царь-батюшка всех API-клиентов. В нём можно коллекции собирать, переменные цеплять, скрипты писать на JavaScript, чтобы ответы автоматически проверять. Раздулся, конечно, как сыч в телеге, но возможностей — овердохуища.
  • Insomnia: Постману прямой конкурент, только интерфейс почище и поприятнее. Многие за него держатся, особенно если с GraphQL работают — там он прям огонь.

Вот и весь расклад, блядь. Для автоматических тестов — родной httptest, для быстрой проверки из консоли — curl или httpie, а для серьёзных ручных тестов и документации — Postman/Insomnia. Выбирай, что душе угодно, главное — API не обосри в продакшене!