老生常谈了,这里主要记录一下,测试用例(test)和压力测试(benchmark)中的注意事项
test测试用例
XXX_test.goXXXTestXXX(t *testing.T)testimporttestinggo testgo test -vt.Errorft.SkipNow()TestXXX()t.Run()testXXXtestXXXt.Run()TestMain(m *tesging.M)m.Run()m.Run()TestMain(m *testing.M)m.Run()m.Run()testMain
package main
import(
"testing"
"fmt"
)
//因为是小写开头所以不会运行
func testPrint(t *testing.T){
//该方法可以跳过当前函数的测试,并通过测试
t.SkipNow()
res := MyFunc()
if res {
t.Errorf("wrong")
}
}
//因为是小写开头所以不会运行
func testprint1(t *testing.T){
res := MyFunc()
if !res {
t.Errorf("wrong 1")
}
}
func TestAll(t *testing.T){
//使用t.Run()调用函数来做顺序执行
t.Run("TestPrint", testPrint)
t.Run("TestPrint1", testPrint1)
}
//初始化函数,首先运行该函数
func TestMain(m *testing.M){
fmt.Println("this is Main test func")
//必须要调用该函数,否则除了TestMain()其他函数都不会执行
fmt.Println("Main test start")
m.Run()
fmt.Println("Main test end")
}
benchMark基准测试
- benchmark函数需要Benchmaik开头
- benchmark的case标准一般会跑b.N次,而且每次执行都是如此
- 在执行中会根据实际的case执行时间是否是稳定的,会一直增加b.N的次数以达到执行时间是一种稳定的状态.比如说第一次我们执行10nm,第二次100nm,第三次300nm,那他就不会停止,会一直增加.等到平均每次执行的时间趋近于稳定他才会停
- 在我们的函数测试时,千万注意被测试函数总能在一定时间内达到一种稳态,否则会永远执行不完
func noSteady(n int) int{
for n >0 {
n--
}
return n
}
func steady(n int){
return
}
func BenchmarkAll(b *testing.B){
for n:=0;n<b.N;n++{
//会永远跑不完,因为我们每次穿进去的n是不一样的,
//而且该函数是线性增长的,比如2就执行2次,3就执行3次,等于N的时候就执行N次
//那么这时候b.N就会不断的调大以适应里面n的变化
//最终永远也跑不完
noSteady(n)
//肯定可以跑完
steady(n)
}
}
查看代码覆盖率
除了能用IDE(IDE的方式就不说了)查看代码覆盖率之外,还可以通过go test的命令行查看代码覆盖率
# 生成覆盖率的文件,这时候内容是看不懂的
go test -coverprofile=c.out
# 生成HTML文件
go tool cover -html=c.out
使用pprof进行性能调试
//生成benchmark的性能测试报告,这时候是2进制文件,看不了
go test -bench . -cpuprofile cpu.out
//借助go tool工具进入命令行操作,输入help可以看到他支持很多功能
go tool pprof cpu.out
//`http://graphviz.org/`下载在查看工具,mac直接`brew install graphviz`即可
//在此命令行中输入web命令在浏览器中查看性能报告
web
//进入浏览器看的时候,方框越大线头越粗就是花时间的地方,有很清楚的说明就不记录了