測試
如何為 Gin 寫測試案例?
傾向使用 net/http/httptest
套件來做 HTTP 測試。
package main
import "github.com/gin-gonic/gin"
type User struct { Username string `json:"username"` Gender string `json:"gender"`}
func setupRouter() *gin.Engine { router := gin.Default() router.GET("/ping", func(c *gin.Context) { c.String(200, "pong") }) return router}
func postUser(r *gin.Engine) *gin.Engine { r.POST("/user/add", func(c *gin.Context) { var user User if err := c.BindJSON(&user); err == nil { c.JSON(200, user) } else { c.JSON(400, gin.H{"error": err.Error()}) } }) return r}
func main() { r := setupRouter() r = postUser(r) r.Run(":8080")}
為上述程式碼所寫的測試:
package main
import ( "encoding/json" "net/http" "net/http/httptest" "strings" "testing"
"github.com/stretchr/testify/assert")
func TestPingRoute(t *testing.T) { router := setupRouter()
w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/ping", nil) router.ServeHTTP(w, req)
assert.Equal(t, 200, w.Code) assert.Equal(t, "pong", w.Body.String())}
// 測試 POST /user/addfunc TestPostUser(t *testing.T) { router := setupRouter() router = postUser(router)
w := httptest.NewRecorder()
// 建立一個用於測試的範例使用者 exampleUser := User{ Username: "test_name", Gender: "male", } userJson, _ := json.Marshal(exampleUser) req, _ := http.NewRequest("POST", "/user/add", strings.NewReader(string(userJson))) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req)
assert.Equal(t, 200, w.Code) // 比較回應主體與範例使用者的 JSON 資料 assert.Equal(t, string(userJson), w.Body.String())}