目录
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)
}
}
标签:pprof,单元测试,test,go,mem,cpu,out From: https://www.cnblogs.com/fsh19991001/p/17657370.html