page contents

Golang--gin框架的单元测试

golang (go) 语言中的gin框架如何实现单元测试 好久没有更新, 之前学习python, 现在又多学习了一门go语言。 go在性能上确实比python要强大很多。但总体各有优劣。 最近在使用gin写一个...

attachments-2021-05-oxdG0QSx60ac60a06ec58.png

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技术交流群一起交流学习哦。

attachments-2022-06-oE4NqKuk62ac181073c73.jpeg

  • 发表于 2021-05-25 10:27
  • 阅读 ( 1470 )
  • 分类:Golang

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章