網頁

2021/8/7

Golang Gin REST API 測試簡單範例

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|/helloAPI的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

github


2 則留言: