Тестирование fastthttp с httptest

Мне интересно, как я могу протестировать приложение, написанное с помощью fasthttp, используя пакет httptest в базовой библиотеке Go.

Я нашел это руководство, которое довольно хорошо объясняет тестирование, но проблема в том, что httptest не удовлетворяет http.Handler интерфейс, поэтому я понятия не имею, как это сделать http.HandlerFunc поскольку fasthttp использует свой собственный fasthttp.ListenAndServe это несовместимо

Любые идеи о том, как создать обертку, или как иным образом тестировать написанную библиотеку fasthttp в конец?

2 ответа

Решение

Есть два возможных подхода. Модульное тестирование обработчика не является действительно жизнеспособным, так как вам нужно будет создать RequestCtx и заглушить / макетировать все необходимые поля.

Вместо этого я бы тестировал код, к которому обращаются ваши обработчики fasthttp. Я бы сделал e2e тестирование самих реальных обработчиков.

Существует реализация прослушивателя в памяти, которую вы можете использовать, чтобы избежать прослушивания через порт TCP или сокет Unix. Вы бы инициализировали сервер, но работали на этом приемнике, а не на сетевом соединении.

Затем вы должны создать HTTP-клиент и вызывать соответствующие методы как обычно, но использовать этот слушатель в качестве транспорта.

Если вы заглушите / подделаете что-нибудь, с чем взаимодействуют ваши обработчики, то вы можете сделать это в памяти только без внешних зависимостей, например, как модульный тест, но он фактически выполнит полный системный тест.

      func TestFasthttpServer(t *testing.T) {
    fSv := fasthttp.Server{}
    fSv.Handler = func(ctx *fasthttp.RequestCtx) {
        if string(ctx.Path()) == "/test" && string(ctx.Method()) == "GET" {
            ctx.WriteString("OK")
        }
    }

    ln := fasthttputil.NewInmemoryListener()

    go fSv.Serve(ln)

    client := http.Client{Transport: &http.Transport{
        DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
            return ln.Dial()
        },
    }}

    resp, _ := client.Get("http://localhost/test")
    respBody, _ := io.ReadAll(resp.Body)
    assert.Equal(t, string(respBody), "OK")
}

Кредиты

Ценные примеры также можно найти здесь .

Другие вопросы по тегам