go单元测试

go test

介绍

1.go test 命令会自动执行_test.go结尾的源码内以Test开头的函数 生成可测试用的执行文件
2.不需要main函数作为入口函数
3.不会参与到正常源码编译
4.执行go test 需要切换目录到存在该文件的同级目录下

语法

go test
    -bench:性能测试(.:表示匹配所有测试函数)
    	eg: go test -v -bench="." -cpu=8 -benchtime="3s" -timeout="5s" -benchmem
    	ps: windows输出的信息不全
    -cpu: 指定GOMAXPROCS
    -benchtime: 测试时长
    -benchmem: 输出内存分配(申请内存次数)
    -timeout: 超时时间
    -blockprofile block.out: 协程阻塞数据写入到block.out 
    -cpuprofile cpu.out: 协程cpu使用数据写入到cpu.out
    -memprofile mem.out: 协程内存申请数据 写入到mem.out
    -mutexprofile mutex.out: 协程互斥数据写入到mutex.out
    -track track.out: 执行调用链写入到track.out
    -v: 显示测试的详情
    -run: 运行特定测试样例中的函数
    	eg: go test -run Test开头的函数名 *_test.go
    	
ps:windows: -bench="." | linux: -bench=.

高级用法

1. 使用go test 做性能测试输出cpu、mem占用信息文件
go test -bench="." -cpuprofile cpu.out  // cpu占用情况
go test -bench="." -cpuprofile mem.out  // mem占用情况

2.1 使用go tool pprof 分析实际cpu、mem情况(pprof性能调试工具 生成相关数据图例)
go tool pprof -text cpu.out
go tool pprof -text mem.out

2.2 生成svg或pdf 文件报告形式查看
go tool pprof -svg cpu.out > cpu.svg
go tool pprof -pdf cpu.out > cpu.pdf
ps: 前置需要下载安装graphviz并配置环境变量(https://graphviz.org/download/) 否则上面命令会报错导出失败

3. 也可以使用runtime/pprof脚本直接生成cpu.out|mem.out 再通过2.2命令生成报告
参考-脚本化生成测试报告数据

4. 交互式分析
go tool pprof cpu.out
ps:交互模式输入web指令后会生成可视化svg文件用于查看

5. 网页形式查看测试报告
参考-网页形式查看测试报告

go test 实例

package daily

import "testing"

func TestRedisOp(t *testing.T) {
	/**
	文件命名规范: *_test.go
	函数名命名规范: Test开头
	*testing.T相关方法:
        Log:输出信息
        Fail:标记失败 继续执行测试
        FailNow:失败 立即终止测试
        Error: Fail + Log
        Fatal: FailNow + Log
	*/
	num := 0
	for i := 0; i < 100000000; i++ {
		num += i
	}
	t.Log("go test...")
}


脚本化生成测试报告数据

package daily

import (
	"fmt"
	"os"
	"runtime/pprof"
	"sync"
)

var (
	wg sync.WaitGroup
)

func taskRun() {
	/**
	实际执行的业务逻辑
	 */
	var sum int
	for i := 0; i < 100000000; i++ {
		sum += i
	}
}

func GeneratePprof() {
	wg.Add(2)
    // 1. 生成cpu.out
	go func() {
		defer wg.Done()
		f, _ := os.Create("cpu.out")
		defer f.Close()
		pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
		taskRun()
	}()
	// 2. 生成mem.out
	go func() {
		defer wg.Done()
		f, _ := os.Create("mem.out")
		defer f.Close()
		defer pprof.WriteHeapProfile(f)
		taskRun()
	}()
	wg.Wait()
	fmt.Println("GeneratePprof执行结束...")
    // 后续可采用go tool pprof -pdf cpu.out > cpu.pdf 命令 分析查看整体执行流程
}

网页形式查看测试报告

1. 分析mem占用情况
go tool pprof http://localhost:9999/debug/pprof/heap?seconds=10

2. 分析cpu占用情况(默认30s)
go tool pprof http://localhost:9999/debug/pprof/profile
package daily

import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
	"time"
)


func taskRun() {
	/**
	实际执行的业务逻辑
	*/
	var sum int
	for i := 0; i < 100000000; i++ {
		sum += i
	}
}

func PprofWeb() {
	http.HandleFunc("/unitTest", func(writer http.ResponseWriter, request *http.Request) {
		/**
		实际业务处理
		*/
		t := time.Now()
		taskRun()
		cost := time.Since(t)
		fmt.Fprint(writer, "unitTest调用耗时:", cost)
	})
	if err := http.ListenAndServe(":9999", nil); err != nil {
		panic(err)
	}
}

posted @   爱编程_喵  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
jQuery火箭图标返回顶部代码

jQuery火箭图标返回顶部代码

滚动滑动条后,查看右下角查看效果。很炫哦!!

适用浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗.

点击右上角即可分享
微信分享提示