目前我们的后端服务提供大量的restful api接口,每次上线都需要测试那边回归一遍这些接口,造成人力的浪费。正好借着这次单元测试和持续集成,我们引入了httptest框架,结合gin来做接口单元测试。
httptest是golang官方提供的一个包,位于/src/net/http/httptest下。
其原理的话我也看了源码研究了下,这里大致说下,它有一个ResponseRecorder结构体,它实现了http.ResponseWriter,同时它自身又包含了http.Response,前者是server端维度下的response,后者是client端维度下的response,也就是说,ResponseRecorder同时实现了server和client的功能。
好接下来看看如何使用httptest
httptest构建
// Get 根据特定请求uri,发起get请求返回响应
func Get(uri string, router *gin.Engine) []byte {
// 构造get请求
req := httptest.NewRequest("GET", uri, nil)
// 初始化响应
w := httptest.NewRecorder()
// 调用相应的handler接口
router.ServeHTTP(w, req)
// 提取响应
result := w.Result()
defer result.Body.Close()
// 读取响应body
body,_ := ioutil.ReadAll(result.Body)
return body
}
// PostForm 根据特定请求uri和参数param,以表单形式传递参数,发起post请求返回响应
func PostForm(uri stri