Go Fiber 框架系列教程 04:測(cè)試應(yīng)用
閱讀本文大概需要 5 分鐘。
大家好,我是 polarisxu。
實(shí)際項(xiàng)目中,大家經(jīng)常不會(huì)對(duì) Web API 寫(xiě)單元測(cè)試。Go 標(biāo)準(zhǔn)庫(kù)不僅有 testing 包支持普通單元測(cè)試,還有 net/http/httptest 包支持 HTTP 的測(cè)試。
本文雖然是測(cè)試 Fiber 應(yīng)用程序,但對(duì)其他的框架也適用。
01 如何測(cè)試
Web API 的單元測(cè)試如何進(jìn)行?
本節(jié)介紹的測(cè)試方法主要是驗(yàn)證請(qǐng)求返回的 HTTP 狀態(tài)碼是否符合預(yù)期。
如果返回的狀態(tài)碼是 200 OK,那么表示這個(gè)測(cè)試用例成功(Pass),如果返回的狀態(tài)碼是 404 Not Found,那么表示這個(gè)測(cè)試用例失?。‵ail)。所以,要求請(qǐng)求返回正確的狀態(tài)碼。
02 VSCode 生成測(cè)試
VSCode 安裝了 Go Team 的 Go 插件后,可以一鍵生成單元測(cè)試。
在某個(gè)函數(shù)上右鍵,出現(xiàn)的菜單中會(huì)有 Generate Unit Tests For Function:

點(diǎn)擊它會(huì)自動(dòng)創(chuàng)建 main_test.go 文件,并生成類(lèi)似下面的代碼:
package?main
import?"testing"
func?Test_main(t?*testing.T)?{
?tests?:=?[]struct?{
??name?string
?}{
??//?TODO:?Add?test?cases.
?}
?for?_,?tt?:=?range?tests?{
??t.Run(tt.name,?func(t?*testing.T)?{
???main()
??})
?}
}
03 動(dòng)手寫(xiě)單元測(cè)試
動(dòng)手之前,需要先介紹下 Fiber 中專(zhuān)門(mén)針對(duì)測(cè)試提供的方法:
//?Test?is?used?for?internal?debugging?by?passing?a?*http.Request.
//?Timeout?is?optional?and?defaults?to?1s,?-1?will?disable?it?completely.
func?(app?*App)?Test(req?*http.Request,?msTimeout?...int)?(resp?*http.Response,?err?error)
該方法接收一個(gè) *http.Request,返回 *http.Response,通過(guò)這個(gè) Response 可以獲得 HTTP StatusCode。
待測(cè)試的程序如下:
//?main.go
package?main
import?(
?"github.com/gofiber/fiber/v2"
)
func?setupRoutes(app?*fiber.App)?{
?app.Get("/hello",?func(ctx?*fiber.Ctx)?error?{
??return?ctx.SendString("Hello?World!")
?})
}
func?main()?{
?app?:=?fiber.New()
?setupRoutes(app)
?app.Listen(":3000")
}
測(cè)試程序如下:
package?main
import?(
?"net/http/httptest"
?"testing"
?"github.com/gofiber/fiber/v2"
?"github.com/stretchr/testify/assert"
)
func?TestHelloRoute(t?*testing.T)?{
?tests?:=?[]struct?{
??description??string
??route????????string?//?route?path?to?test
??expectedCode?int????//?expected?HTTP?status?code
?}{
??{
???description:??"get?HTTP?status?200",
???route:????????"/hello",
???expectedCode:?200,
??},
??{
???description:??"get?HTTP?status?404,?when?route?is?not?exists",
???route:????????"/notfound",
???expectedCode:?404,
??},
?}
?app?:=?fiber.New()
?setupRoutes(app)
?for?_,?test?:=?range?tests?{
??//?利用?httptest?包生成?request
??req?:=?httptest.NewRequest("GET",?test.route,?nil)
??resp,?_?:=?app.Test(req,?1)
??assert.Equalf(t,?test.expectedCode,?resp.StatusCode,?test.description)
?}
}
我們還用了 github.com/stretchr/testify 庫(kù),這是一個(gè)輔助測(cè)試的庫(kù),assert 是它的子包,用于進(jìn)行斷言。
然后運(yùn)行如下命令測(cè)試:
$?go?test?-v?.
===?RUN???TestHelloRoute
---?PASS:?TestHelloRoute?(0.00s)
PASS
ok???github.com/polaris1119/fiber-example
04 總結(jié)
本文從 HTTP 狀態(tài)碼的維度測(cè)試 Web API,保證 API 大的邏輯正確,但不包括業(yè)務(wù)邏輯相關(guān)的測(cè)試。
