gin 如何做测试

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,来拦截网络请求。这样,不需要真正服务就绪,也不需要后端服务配合,就可以模拟各种情况,以验证代码逻辑正确性。

humboldt Written by:

humboldt 的趣味程序园