Тестирование 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")
}
Ценные примеры также можно найти здесь .