Go Fiber 框架之測(cè)試應(yīng)用
大家好,我是 polarisxu。
實(shí)際項(xiàng)目中,大家經(jīng)常不會(huì)對(duì) Web API 寫單元測(cè)試。Go 標(biāo)準(zhǔn)庫不僅有 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è)試用例失敗(Fail)。所以,要求請(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 文件,并生成類似下面的代碼:
- 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)手寫單元測(cè)試
動(dòng)手之前,需要先介紹下 Fiber 中專門針對(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,通過這個(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 庫,這是一個(gè)輔助測(cè)試的庫,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è)試。
本文轉(zhuǎn)載自微信公眾號(hào)「polarisxu」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系polarisxu公眾號(hào)。