编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

golang从入门到精通,Gin Web开发,单元测试

wxchong 2024-07-25 13:31:55 开源技术 15 ℃ 0 评论

demo1/demo1.go源码及解析

package main

import (
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
)

func Index(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"id":   101,
		"name": "张三",
	})
}
func main() {
	//gin.Default()返回一个引擎实例,该实例已经连接了记录器和恢复中间件。
	//gin.Default()实际上进行了3步操作
	//1. debugPrintWARNINGDefault()
	//默认的调试打印输出
	//2. engine := New()
	//New返回一个新的空白引擎实例,不附带任何中间件。
	//engine.Use(Logger(), Recovery())
	//engine.Use将一个全局中间件连接到路由器。
	//通过Use()连接的中间件将包含在每个请求的处理程序链中。
	//甚至404、405,静态文件...
	//Logger()实例一个Logger中间件,它将把日志写到gin.DefaultWriter。
	//默认情况下是gin.DefaultWriter = os.Stdout。
	//Recovery()返回一个中间件,它可以从任何panics(恐慌)中恢复过来,如果有500,它会写入500。
	app := gin.Default()
	//GET是router.Handle("GET", path, handle)的路由快捷写法。
	app.GET("/", Index)
	//app.Run():启用http.Server路由,并开始侦听和服务HTTP请求。
	err := app.Run(":80")
	if err != nil {
		log.Panicln(err.Error())
	}
}

demo1/demo1_test.go单元测试源码及解析

package main

import (
	"github.com/gin-gonic/gin"
	"io/ioutil"
	"log"
	"net/http/httptest"
	"testing"
)

func TestIndex(t *testing.T) {
	//设置log显示信息格式
	//log.LstdFlags:表示标准输出 Ldate | Ltime
	//log.Llongfile:表示输出长文件名和行号
	log.SetFlags(log.LstdFlags | log.Llongfile)
	//gin.Default()返回一个引擎实例,该实例已经连接了记录器和恢复中间件。
	//gin.Default()实际上进行了3步操作
	//1. debugPrintWARNINGDefault()
	//默认的调试打印输出
	//2. engine := New()
	//New返回一个新的空白引擎实例,不附带任何中间件。
	//engine.Use(Logger(), Recovery())
	//engine.Use将一个全局中间件连接到路由器。
	//通过Use()连接的中间件将包含在每个请求的处理程序链中。
	//甚至404、405,静态文件...
	//Logger()实例一个Logger中间件,它将把日志写到gin.DefaultWriter。
	//默认情况下是gin.DefaultWriter = os.Stdout。
	//Recovery()返回一个中间件,它可以从任何panics(恐慌)中恢复过来,如果有500,它会写入500。
	router := gin.Default()
	//GET是router.Handle("GET", path, handle)的路由快捷写法。
	router.GET("/", Index)
	//func NewRequest(method string, target string, body io.Reader) *http.Request
	//对于http.Handler单元测试,可以使用NewRequest返回一个新的传入服务器请求。
	//在测试的过程中,当NewRequest发生错误时,会触发panics(恐慌),
	//method:可以是POST、GET等,默认的就是"GET"
	//target:可以是路径,也可以是绝对网址。如果目标是绝对网址,则使用该网址的主机名。
	//body:可以是nil,如果body是*bytes.Reader类型、*strings.Reader类型、*bytes.Buffer,需要设置请求长度。
	req := httptest.NewRequest("GET", "/", nil)
	//func NewRecorder() *ResponseRecorder
	//httptest.NewRecorder()将返回一个初始化的ResponseRecorder.
	w := httptest.NewRecorder()
	//ServeHTTP通过参数w和req设置HTTP请求
	router.ServeHTTP(w, req)
	//w.Result():返回处理程序生成的响应。
	//返回的响应包括:状态码、标题、正文和可选的尾部。
	result := w.Result()
	//result.Body表示响应体。
	//读取body字段时,响应body将按需流式传输。
	//如果网络连接失败或服务器终止响应,读取body返回non-nil。
	//如果服务器用分块传输,body将自动删除。
	bytes, err := ioutil.ReadAll(result.Body)
	if err != nil {
		log.Fatalln(err.Error())
	}
	log.Println(string(bytes))
	t.Log(string(bytes))
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表