基于gin的golang web开发:Gin技术拾遗
本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题。
拾遗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
都会得到正确的结果。