接口测试

Gin 接口可以用 Go 标准库 net/http/httptest 测试。

一、把路由创建逻辑拆出来

不要把所有代码都写死在 main 函数里。

func SetupRouter() *gin.Engine {
	router := gin.Default()

	router.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "pong"})
	})

	return router
}

func main() {
	router := SetupRouter()
	router.Run(":8080")
}

这样测试时可以直接拿到 router

二、测试 GET 接口

创建 main_test.go

package main

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/gin-gonic/gin"
)

func TestPing(t *testing.T) {
	gin.SetMode(gin.TestMode)

	router := SetupRouter()

	req := httptest.NewRequest(http.MethodGet, "/ping", nil)
	w := httptest.NewRecorder()

	router.ServeHTTP(w, req)

	if w.Code != http.StatusOK {
		t.Fatalf("期望状态码 200,实际是 %d", w.Code)
	}
}

运行:

go test ./...

三、测试 POST JSON

接口:

type CreateUserRequest struct {
	Name string `json:"name" binding:"required"`
}

func createUser(c *gin.Context) {
	var req CreateUserRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(400, gin.H{"message": "参数错误"})
		return
	}

	c.JSON(201, gin.H{"name": req.Name})
}

测试:

func TestCreateUser(t *testing.T) {
	gin.SetMode(gin.TestMode)

	router := gin.Default()
	router.POST("/users", createUser)

	body := strings.NewReader(`{"name":"张三"}`)
	req := httptest.NewRequest(http.MethodPost, "/users", body)
	req.Header.Set("Content-Type", "application/json")

	w := httptest.NewRecorder()
	router.ServeHTTP(w, req)

	if w.Code != http.StatusCreated {
		t.Fatalf("期望状态码 201,实际是 %d", w.Code)
	}
}

需要导入:

import "strings"

四、为什么要测试 handler

接口测试可以帮你确认:

  • 路由是否注册正确。
  • 参数绑定是否正确。
  • 状态码是否符合预期。
  • 错误响应是否统一。

入门阶段先测核心接口,不需要一开始追求覆盖所有细节。