golang(go) gin 框架 单元测试

golang (go) 语言中的gin框架如何实现单元测试

好久没有更新, 之前学习python, 现在又多学习了一门go语言。 go在性能上确实比python要强大很多。但总体各有优劣。

最近在使用gin写一个东西的时候,出现了一个问题:浏览器模拟请求进行代码测试,是看不 代码性能如何的,更别说调优了。那么怎么使用单元测试对其进行调优? 写出的代码性能怎么样,有什么需要改进的地方?

这就要提到单元测试,go的单元测试很有特点,能够快速进行压力测试、 代码对cpu及内存的消耗等等。 一般的单元测试这里就不多说了。
我想说的是使用gin框架写服务器的单元测试.

如何模拟请求发送?如何运行写好的gin服务?这显然是这个问题的关键

其实go里面有个模块专门来实现这个功能。我在网上查了下,没有一个好的:

  • 第一、资源很少,
  • 第二、资源质量不高, 根本看不下去。看了完全不知所云。
    我想说:这种事情还得靠自己, 还得看文档, 还得看源码。

废话不多。真正的内容在这里
使用测试模块如下:

github.com/Valiben/gin_unit_test

首先明白一点, 该模块是对处理函数的测试,所以在测试单元中要定义gin 框架的engine(就是平时的router := gin.Default()), 也要发送http请求并接收内容。

为理解逻辑,这里只放了一个简单示例, 更多的内容请看源码及用法。

直接上一个示例代码,
testGin.go 文件

package testGin

import (
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
)
// 解决请求传过来的参数结构体
type User struct {
	UserName string `form:"username" json:"username" binding:"required"`
	Password string `form:"password" json:"password" binding:"required"`
	Age      int    `form:"age" json:"age" binding:"required"`
}
// 这是登陆的处理函数
func LoginHandler(c *gin.Context) {
	req := &User{}
	if err := c.Bind(req); err != nil {
		log.Printf("err:%v", err)
		c.JSON(http.StatusOK, gin.H{
			"errno":  "1",
			"errmsg": err.Error(),
		})
		return
	}

	// judge the password and username
	if req.UserName != "Valiben" || req.Password != "123456" {
		c.JSON(http.StatusOK, gin.H{
			"errno":  "2",
			"errmsg": "password or username is wrong",
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"errno":  "0",
		"errmsg": "login success",
	})
}

testGin_test.go 测试单元文件

package testGin

import (
	"fmt"
	utils "github.com/Valiben/gin_unit_test"
	"github.com/gin-gonic/gin"
	"testing"
)

func init() {
	router := gin.Default()  // 这需要写到init中,启动gin框架
	router.POST("/login", LoginHandler)
	utils.SetRouter(router)  //把启动的engine 对象传入到test框架中
}
// 解析返回的错误类型
type OrdinaryResponse struct {
	Errno  string `json:"errno"`
	Errmsg string `json:"errmsg"`
}
// 真正的测试单元
func TestLoginHandler(t *testing.T) {
	// 定义发送POST请求传的内容
	user := map[string]interface{}{
		"username": "Valiben",
		"password": "123456",
		"age":      13,
	}
	// 把返回response解析到resp中
	resp := OrdinaryResponse{}
	// 调用函数发起http请求
	err := utils.TestHandlerUnMarshalResp("POST", "/login", "json", user, &resp)
	if err != nil {
		t.Errorf("TestLoginHandler: %v\n", err)
		return
	}
	// 得到返回数据结构体, 至此,完美完成一次post请求测试, 
	// 如果需要benchmark 输出性能报告也是可以的
	fmt.Println("result:", resp)	
}

本文就些完结。更多用法及内容请参考:
https://github.com/Valiben/gin_unit_test/blob/master/test/handlers.go

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值