Gin 的 HTTP 测试路线非常清晰:
优先用 net/http/httptest。
#1. 一个最小测试例子
func setupRouter() *gin.Engine {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
return r
}
func TestPing(t *testing.T) {
gin.SetMode(gin.TestMode)
r := setupRouter()
w := httptest.NewRecorder()
req, _ := http.NewRequest(http.MethodGet, "/ping", nil)
r.ServeHTTP(w, req)
if w.Code != http.StatusOK {
t.Fatalf("expected 200, got %d", w.Code)
}
if w.Body.String() != "pong" {
t.Fatalf("unexpected body: %s", w.Body.String())
}
}#2. 为什么这套测试很自然
因为 Gin 本质上就是 http.Handler,所以测试时根本不需要真的把服务跑起来:
构造请求
│
▼
交给 Gin Engine
│
▼
录制响应
│
▼
断言状态码、响应体、Header#3. gin.TestMode 的意义
官方测试文档专门提醒:
gin.SetMode(gin.TestMode)这样能关闭测试里那些不必要的 debug 路由注册输出,让测试日志干净很多。