Golang單元測試要求代碼文件以_test
結尾,單元測試方法以Test
開頭,參數爲*testing.T類型。如下是一個計算hash值的工具包和對應的單元測試。前端
hashUtils.gogit
package utils import ( "crypto/md5" "crypto/sha1" "fmt" ) func Md5(str string) string { data := []byte(str) has := md5.Sum(data) return fmt.Sprintf("%X", has) } func SHA1(data []byte) []byte { h := sha1.New() h.Write(data) return h.Sum(nil) }
hashUtils_test.gogithub
package utils import ( "fmt" "testing" ) func TestMd5(t *testing.T) { content := "123456" md5 := Md5(content) if "E10ADC3949BA59ABBE56E057F20F883E" != md5 { t.Errorf("md5 failed") } } func TestSHA1(t *testing.T) { content := "123456" sha1 := fmt.Sprintf("%x", SHA1([]byte(content))) if "7c4a8d09ca3762af61e59520943dc26494f8941b" != sha1 { t.Errorf("sha1 failed") } }
除了測試這種邏輯代碼咱們還須要測試HTTP的請求響應。Gin推薦使用net/http/httptest
測試HTTP相關的代碼。golang
啓動一個Gin服務器main.goweb
package main func setupRouter() *gin.Engine { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return r } func main() { r := setupRouter() r.Run(":8080") }
單元測試main_test.go服務器
package main import ( "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" ) func TestPingRoute(t *testing.T) { router := setupRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/ping", nil) router.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) assert.Equal(t, "pong", w.Body.String()) }
先看代碼工具
userRouter := router.Group(`users`) { userRouter.GET(`/`, userHandler.UserList) }
咱們聲明瞭路由/users/
,這是一個Web Api,傳入參數的url大概是這樣的/users/?pageIndex=1&pageSize=10
。用戶訪問/users?pageIndex=1&pageSize=10
時也能正常返回數據,這是由於Gin幫咱們作了一次301跳轉,問題就出在這裏。咱們的路由是Web Api用戶多是JS前端,也多是其餘的業務系統。若是用戶不支持301跳轉呢?單元測試
其實咱們只要在增長一個空路徑路由就能夠解決問題。測試
userRouter := router.Group(`users`) { userRouter.GET(``, userHandler.UserList) userRouter.GET(`/`, userHandler.UserList) }
如今無論用戶訪問/users/?pageIndex=1&pageSize=10
仍是訪問/users?pageIndex=1&pageSize=10
都會獲得正確的結果。url