Gin的REST API測試程式簡單範例。
本範例修改於「Golang Gin Web Framework hello world範例」。
受測程式
main.go
為啟動Gin及router API路徑的設定。把原本的router API設定移出至setupServer()
函式作為在測試程式中測試前的設置。因為只是要測試API回應是否符合預期,測試時不會透過網路發送真的
HTTP請求因此不用運行Server。
/hello
為要被測試的API路徑。
main.go
package main
import "github.com/gin-gonic/gin"
func main() {
server := setupServer()
server.Run(":8080")
}
func setupServer() *gin.Engine {
router := gin.Default()
router.GET("/hello", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "hello world"})
})
return router
}
測試程式
在main.go
同目錄下新增測試程式main_test.go
。
在測試方法TestHello()
中首先呼叫setupServer()
設置好受測路由。
使用http.NewRequest()
建立一個測試GET|/hello
API的http.Request
實例。
使用httptest.NewRecorder()
建立一個實作http.ResponseWriter
介面的httptest.ResponseRecorder
實例,用來記錄API回應的內容。
使用gin.Engine.ServerHttp()
處理請求及寫出回應,相當於模擬呼叫API。
使用Testify assert
驗證API的回應是否符合預期。
main_test.go
package main
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
)
func TestHello(t *testing.T) {
server := setupServer()
req, _ := http.NewRequest("GET", "/hello", nil) // 建立一個請求
w := httptest.NewRecorder() // 建立一個ResponseRecorder其實作http.ResponseWriter,用來記錄response狀態
server.ServeHTTP(w, req) // gin.Engine.ServerHttp實作http.Handler介面,用來處理HTTP請求及回應。
expectedStatus := http.StatusOK
expectedContent := "hello world"
assert.Equal(t, expectedStatus, w.Code)
assert.Contains(t, w.Body.String(), expectedContent)
}
執行測試
在專案目錄以命令列執行go test -v
開始測試。
$ go test -v
=== RUN TestHello
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /hello --> abc.com/demo.setupServer.func1 (3 handlers)
[GIN] 2021/08/08 - 12:01:52 | 200 | 37.732µs | | GET "/hello"
--- PASS: TestHello (0.00s)
PASS
ok abc.com/demo 0.138s
不能用
回覆刪除Hi 樓上,請檢查Go版本和gin module版本
回覆刪除