拾遺1:單元測試
Golang單元測試要求程式碼檔案以_test
結尾,單元測試方法以Test
開頭,引數為*testing.T型別。以下是一個計算hash值的工具包和對應的單元測試。
hashUtils.go
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.go
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相關的程式碼。
啟動一個Gin伺服器main.go
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())
}
拾遺2:路由
先看程式碼
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
都會得到正確的結果。