Go Fiber 框架之測試應(yīng)用
大家好,我是 polarisxu。
實際項目中,大家經(jīng)常不會對 Web API 寫單元測試。Go 標準庫不僅有 testing 包支持普通單元測試,還有 net/http/httptest 包支持 HTTP 的測試。
本文雖然是測試 Fiber 應(yīng)用程序,但對其他的框架也適用。
01 如何測試
Web API 的單元測試如何進行?
本節(jié)介紹的測試方法主要是驗證請求返回的 HTTP 狀態(tài)碼是否符合預(yù)期。
如果返回的狀態(tài)碼是 200 OK,那么表示這個測試用例成功(Pass),如果返回的狀態(tài)碼是 404 Not Found,那么表示這個測試用例失敗(Fail)。所以,要求請求返回正確的狀態(tài)碼。
02 VSCode 生成測試
VSCode 安裝了 Go Team 的 Go 插件后,可以一鍵生成單元測試。
在某個函數(shù)上右鍵,出現(xiàn)的菜單中會有 Generate Unit Tests For Function:
點擊它會自動創(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 動手寫單元測試
動手之前,需要先介紹下 Fiber 中專門針對測試提供的方法:
- // 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)
該方法接收一個 *http.Request,返回 *http.Response,通過這個 Response 可以獲得 HTTP StatusCode。
待測試的程序如下:
- // 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")
- }
測試程序如下:
- 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 庫,這是一個輔助測試的庫,assert 是它的子包,用于進行斷言。
然后運行如下命令測試:
- $ go test -v .
- === RUN TestHelloRoute
- --- PASS: TestHelloRoute (0.00s)
- PASS
- ok github.com/polaris1119/fiber-example
04 總結(jié)
本文從 HTTP 狀態(tài)碼的維度測試 Web API,保證 API 大的邏輯正確,但不包括業(yè)務(wù)邏輯相關(guān)的測試。
本文轉(zhuǎn)載自微信公眾號「polarisxu」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系polarisxu公眾號。