Gin使用

栏目: 编程工具 · 发布时间: 5年前

内容简介:对于接口测试,很多情况都在使用

Gin net/http 包做了封装,支持路由、中间件等特性,极大的方便对 Http Server 的开发。文章通过一个 Test 例子,来简要介绍。对于特别基础的部分,请阅读参考文章。

接口测试

Gotesting 包为程序自测提供了便利。可以查阅之前写的博客 Go test基础用法 ,对其内容,我还是挺满意的。

使用 Postman

对于接口测试,很多情况都在使用 Postman 这样的工具。首先在本地启动服务,然后在 Postman 中配置请求的地址和参数、执行请求、查看结果。

这种方式唯一让人不满意的地方在于:每次修改都需要重启服务。跟直接执行一次 Test 相比,明显多了一步。

使用 Test

测试基类

下面的代码作为接口测试的基类。

TestMain 中,我们为所有的测试用例指定通用的配置。之后在执行其他 Test 前,都会先执行 TestMain 中的代码。有效的避免了代码冗余。

getRouter 方法用于返回一个 gin 的实例。我们将服务的路由重新在 Test 中指定,并设置了中间件。

testHttpResponse 是我们请求处理的核心代码,发送请求,并保存响应到 w

//common_test.go

func TestMain(m *testing.M) {

    //声明执行Test前的操作
    gin.SetMode(gin.TestMode)
    testutils.NewTestApp("../conf.test.toml")

    flag.Parse()
    os.Exit(m.Run())
}

//设置路由,获取框架Gin的实例
func getRouter() *gin.Engine {
    router := gin.Default()

    //配置路由,这是我项目中的自定义配置
    router.Use(middleware.HeaderProcess())
    RouteAPI(router)

    return router
}

//统一处理请求返回结果
func testHttpResponse(t *testing.T, r *gin.Engine, req *http.Request, f func(w *httptest.ResponseRecorder) error) {
    w := httptest.NewRecorder()
    r.ServeHTTP(w, req)

    if err := f(w); err != nil {
        t.Fatal(err)
    }
}

测试用例

下面是具体的测试用例。我们构造了一个 Json 数据格式的 POST 请求,然后通过调用 testHttpResponse 方法来读取接口的响应数据。

关于 NewRequest 方法,它参数 body 传递一个 io.Reader 接口类型。从源代码可以看出,实现了该接口的分别是: bytes.Bufferbytes.Readerstrings.Reader

func TestWeChatRecharge(t *testing.T) {
    router := getRouter()

    //构造json的请求体
    params := map[string]interface{}{
        "open_id":     "olFg1s3gPcISnooRX9WSkX_E-cww",
        "device_type": "ANDROID",
    }
    jsonParams, _ := json.Marshal(params)
    readParams := bytes.NewReader(jsonParams)
    req, _ := http.NewRequest("POST", "/pay/wx/recharge", readParams)
    req.Header.Set("Content-type", "application/json")

    //发送请求
    testHttpResponse(t, router, req, func(w *httptest.ResponseRecorder) error {
        p, err := ioutil.ReadAll(w.Body)
        if err != nil {
            return err
        }

        t.Logf("%+v", string(p))
        return nil
    })
}

小结

通过上述的步骤,我们实现了直接在 Test 中做接口测试。

Middleware

声明一个 middleware 函数,返回类型为 type HandlerFunc func(*Context)

func setUserStatus() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println("set status")
    }
}

如果需要将函数应用于所有的请求,使用 Use 方法。比如统一的请求头转换、错误输出、日志打印等

//Use adds middleware to the group
router.Use(setUserStatus())

下面是给具体的请求设置中间件。从这里可以看出,中间件处理函数和正常的业务处理函数类型是相同的。

//Use a particular middleware
articleRoutes.GET("/create", setUserStatus(), showArticleCreationPage)

最后系统依次调用注册的 handler 完成请求处理:

func (c *Context) Next() {
    c.index++
    for s := int8(len(c.handlers)); c.index < s; c.index++ {
        c.handlers[c.index](c)
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构与算法:python语言实现

数据结构与算法:python语言实现

迈克尔.·T·古德里奇、罗伯托·塔玛西亚、迈克尔·H·戈德瓦瑟 / 张晓、赵晓南 / 机械工业出版社 / 2018-9 / 109.00元

本书采用Python语言讨论数据结构和算法,详细讲解其设计、分析与实现过程,是一本内容全面且特色鲜明的教材。书中将面向对象视角贯穿始终,充分利用Python语言优美而简洁的特点,强调代码的健壮性和可重用性,关注各种抽象数据类型以及不同算法实现策略的权衡。一起来看看 《数据结构与算法:python语言实现》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具