Тестирование HTTP-обработчиков в Go


Введение

В этом примере я создам модульные тесты с помощью библиотеки httptest, и мы увидим, как создать тестовое покрытие для обработчиков http.

Как тестировать http-обработчики в Go?

Чтобы мы могли протестировать любой обработчик http, нам нужна структура для хранения ответа обработчика, такого как код состояния http, заголовки, тело и т.д.
Пакет httptest предоставляет структуру httptest.ResponseRecorder, это все, что нам нужно для хранения ответа обработчика.

// NewRecorder returns an initialized ResponseRecorder.
func NewRecorder() *ResponseRecorder {
    return &ResponseRecorder{
        HeaderMap: make(http.Header),
        Body:      new(bytes.Buffer),
        Code:      200,
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Пример API

В нашем примере API у нас есть обработчик /check-is-prime, который проверяет, является ли число простым.

Код:

Первый тест

Логика тестов очень проста, для каждого теста мы создаем HTTP-запрос, а затем сравниваем ответ.

Добавление дополнительных тестов

Используя табличный дизайн в тестах, легко добавлять дополнительные случаи:

{
    name: "must return http.StatusOk and true to prime number (7)",
    args: func(*testing.T) args {
        req, err := http.NewRequest("GET", "/check-is-prime", nil)
        if err != nil {
            t.Fatalf("fail to create request: %s", err.Error())
        }

        q := req.URL.Query()
        q.Add("number", "7")
        req.URL.RawQuery = q.Encode()

        return args{
            req: req,
        }
    },
    wantCode: http.StatusOK,
    wantBody: "true",
},
{
    name: "must return http.StatusOk and false because number (1) is not prime",
    args: func(*testing.T) args {
        req, err := http.NewRequest("GET", "/check-is-prime", nil)
        if err != nil {
            t.Fatalf("fail to create request: %s", err.Error())
        }

        q := req.URL.Query()
        q.Add("number", "1")
        req.URL.RawQuery = q.Encode()

        return args{
            req: req,
        }
    },
    wantCode: http.StatusOK,
    wantBody: "false",
},
Вход в полноэкранный режим Выход из полноэкранного режима

Полный код:

Заключение

Наличие этих утилит в стандартной библиотеке Go очень помогает при создании и сопровождении наших тестов. Мы убедились в этом на практике с помощью пакета httptest.

Еще один важный момент — изолировать создание mux, это необходимо для вызова обработчиков в тестах.

Оцените статью
devanswers.ru
Добавить комментарий