ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

gin单元测试启动服务后测试controller接口

2022-06-17 10:02:57  阅读:191  来源: 互联网

标签:http string 单元测试 controller go gin com


1、使用的包是 net/http/httptest 

2、单元测试需要启动 gin 服务,然后 httptest.NewRequest 发送请求

示例代码:

mkdir gin
cd gin
go mod init example.com
go get github.com/gin-gonic/gin
gp get github.com/stretchr/testify

创建 web 控制器

cd gin
mkdir controller
touch user.go
touch user_test.go

其中 user.go 的内容

package controller

import (
    "fmt"
    "net/http"

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

// Param 请求参数
type Param struct {
    Name string `json:"name"`
}

// helloHandler /hello请求处理函数
func helloHandler(c *gin.Context) {
    var p Param
    if err := c.ShouldBindJSON(&p); err != nil {
        c.JSON(http.StatusOK, gin.H{
            "msg": "we need a name",
        })
        return
    }
    c.JSON(http.StatusOK, gin.H{
        "msg": fmt.Sprintf("hello %s", p.Name),
    })
}

// SetupRouter 路由
func SetupRouter() *gin.Engine {
    router := gin.Default()
    router.POST("/hello", helloHandler)
    return router
}

单元测试代码 user_test.go

package controller

import (
    "encoding/json"
    "net/http"
    "net/http/httptest"
    "strings"
    "testing"

    "github.com/stretchr/testify/assert"
)

type p struct {
    name   string
    param  string
    expect string
}

// go test -timeout 30s -run ^Test_helloHandler$ example.com/controller
func Test_helloHandler(t *testing.T) {
    // 定义两个测试用例
    tests := []p{
        {"base case", `{"name": "jack"}`, "hello jack"},
        {"bad case", "", "we need a name"},
    }
    r := SetupRouter()
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            // mock一个HTTP请求
            req := httptest.NewRequest("POST", "/hello", strings.NewReader(tt.param))
            // mock一个响应记录器
            w := httptest.NewRecorder()
            // 让server端处理mock请求并记录返回的响应内容
            r.ServeHTTP(w, req)
            // 校验状态码是否符合预期
            assert.Equal(t, http.StatusOK, w.Code)
            // 解析并检验响应内容是否复合预期
            var resp map[string]string
            err := json.Unmarshal(w.Body.Bytes(), &resp)
            assert.Nil(t, err)
            assert.Equal(t, tt.expect, resp["msg"])
        })
    }
}

在controller所在的目录执行用例 (用 goland 和 vscode 都可以 , 用goland 可以很方便地看单元测试代码覆盖率)

cd controller
go test -timeout 30s -run ^Test_helloHandler$ example.com/controller

需要启动 gin 服务器相对比较麻烦

 

标签:http,string,单元测试,controller,go,gin,com
来源: https://www.cnblogs.com/xuweiqiang/p/16384643.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有