前一段时间需要对自己的项目做性能测试,于是研究了一下Golang的testing包。testing包为Golang Package提供自动化测试的支持,通过go test命令可以执行如下形式的函数
func TestXxx(*testing.T)
需要注意的是Golang语言规范函数采取驼峰命名的方式,因此Xxx必须是以大写字母开头。
要编写一个新的测试脚本需要以"_test.go"结尾,该文件包含上述的TestXxxx函数,该文件应该和被测试的文件放在同一个包里,这些文件被排除在正常的package之外,运行"go test"命令将被包含。要了解详细信息可运行"go help test"和"go help testflag"了解。
Testing函数可以用来做单元测试,下面是一个样例函数:
func TestPing(t *testing.T) {
m := make(map[string]int)
m["a"] = 1
b, ok := m["b"]
assert.True(t, ok)
}
功能是测试相应的map里有没有b这个key。
- assert为Golang中的测试提供一系列断言函数
- T类型
*testing.T类型用于管理测试状态并支持格式化测试日志。测试日志会在执行测试的过程中不断累积,并在测试完成时转储至标准输出。当一个测试的测试函数返回时,又或者当一个测试函数调用 FailNow、 Fatal、Fatalf、SkipNow、Skip 或者 Skipf 中的任意一个时,该测试即宣告结束。
运行"go test"我们可以看到
性能测试
性能测试用来检测函数的性能,编写方法和单元测试类似,在_test.go文件中,需要注意的是性能测试的函数以Benchmark开头。函数形如:
func BenchmarkXxx(*testing.B)
要运行性能测试需要执行明星 “go test -bench” 要了解更多的test命令行信息可以了解go testing flags。性能测试会按照顺序来执行。下面是一个样性能测试函数:
func BenchmarkPrinln(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Printlnf("hello")
}
}
B是传递给性能测试的类型,用来管理性能测试的时间和迭代次数。N是B的属性,表示迭代多少轮次,在性能测试期间会调整 b.N 直到测试函数持续足够长的时间。最后性能测试的输出如下:
表示一个轮次425333ns。
如果要了解哪个函数消耗的内存和CPU比较多可以设置CPU和mem的输出,执行该命令,则CPU的分析为cpu.out,内存消耗分析为mem.out
go test -bench=. -run=none -cpuprofile cpu.out -memprofile mem.out -count=5
可以使用go tool pprof对cpu和mem的耗时进行分析。go tool pprof是一个命令行工具,用来对CPU概要文件,内存概要文件和程序阻塞概要文件进行分析。 go tool pprof有很多有用的功能,利用生成CPU,MEM文件的火焰图等图形化分析文件,但是需要安装graphviz软件,大家可以安装这个软件再进行相关分析。