gin 如何做测试
本文介绍下,当使用gin作为web框架的情况下,如何做测试呢?
go语言中,做http测试,可以使用官方的httptest 这个包。
当然,gin也是可以使用这个包进行测试的。而不用起服务来测试
示例
package test
import (
"github.com/gin-gonic/gin"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/http/httptest"
"testing"
)
func TestOne(t *testing.T) {
//将gin设置为测试模式
gin.SetMode(gin.TestMode)
router := gin.New()
//待测试的接口,这里返回一个OK
router.GET("/test", func(c *gin.Context) {
c.String(200, "OK")
})
//构建返回值
w := httptest.NewRecorder()
//构建请求
r, _ := http.NewRequest("GET", "/test", nil)
//调用请求接口
router.ServeHTTP(w, r)
resp := w.Result()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(resp.StatusCode)
fmt.Println(resp.Header.Get("Content-Type"))
//获得结果,并检查
if string(body) != "OK" {
log.Fatal("body is not ok")
}
}
经过上诉,基本就完成了整个测试过程。
客户端侧测试
光是上诉测试,可能还远远不够,因为一个服务,不单需要响应请求过来的数据。 还需要向后端请求数据。
可以使用这个mock工具。
附上官网的一个示例
package test
import (
"github.com/nbio/st"
"gopkg.in/h2non/gock.v1"
"io/ioutil"
"net/http"
"testing"
)
func TestSimple(t *testing.T) {
defer gock.Off()
gock.New("http://foo.com").
Get("/bar").
Reply(200).
JSON(map[string]string{"foo": "bar"})
res, err := http.Get("http://foo.com/bar")
st.Expect(t, err, nil)
st.Expect(t, res.StatusCode, 200)
body, _ := ioutil.ReadAll(res.Body)
st.Expect(t, string(body)[:13], `{"foo":"bar"}`)
// Verify that we don't have pending mocks
st.Expect(t, gock.IsDone(), true)
}
它是通过修改默认客户端的Transport,来拦截网络请求。这样,不需要真正服务就绪,也不需要后端服务配合,就可以模拟各种情况,以验证代码逻辑正确性。