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