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)
}
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!