本文翻译自我的英文博客,最新修订内容可随时参考:Go Common Test
Go语言中的测试方法主要分为三种类型:单元测试、基准测试和示例测试。
首先:
- 你需要先导入
testing
包。 - 在包目录中,所有后缀为
*_test.go
的源代码文件都是go test测试的一部分,并且不会被go build编译到最终的可执行文件中。
单元测试
基本格式/签名为:
func TestXxx(t *testing.T) {
// ...
}
将_test.go和.go文件放在同一目录下,运行go test -v
可以详细执行测试,运行go test -cover
可以检查测试覆盖率。
基准测试
基准测试默认不会执行,你需要使用go test -bench=Xxx
来执行基准测试。
基本格式/签名为:
func BenchmarkXxx(b *testing.B) {
for i := 0; i < b.N; i++ {
// ...
}
}
b.N
是测试运行的次数,这个值由go test工具自动调整。
BenchmarkSplit-8 10000000 215 ns/op
-8
表示测试在8个GOMAXPROCS上运行10000000
表示测试运行了10000000次215 ns/op
表示每次操作平均耗时215纳秒
go test -bench=Xxx -benchmem
可以检查内存分配和每次操作的分配次数。
BenchmarkSplit-8 10000000 215 ns/op 112 B/op 3 allocs/op
112 B/op
表示每次操作分配112字节3 allocs/op
表示每次操作分配3次
性能比较
// 注意:这里的n是Fib函数的参数,而不是b.N,b.N是测试运行的次数,由go test工具自动调整。
func benchmarkFib(b *testing.B, n int) {
for i := 0; i < b.N; i++ {
Fib(n)
}
}
func BenchmarkFib1(b *testing.B) {
benchmarkFib(b, 1) }
func BenchmarkFib2(b *testing.B) {
benchmarkFib(b, 2) }
func BenchmarkFib3(b *testing.B) {
benchmarkFib(b, 3) }
go test -bench=.
会对所有以Benchmark
为前缀的函数执行基准测试。
func BenchmarkSplit(b *testing.B) {
time.Sleep(5 * time.Second) // 一些耗时操作
b.ResetTimer() // 重置计时器(忽略上面的时间)
for i := 0; i < b.N; i++ {
// 一些耗时操作
}
}
// 你也可以使用这种方法
func BenchmarkSplit(b *testing.B) {
b.StopTimer()
// 一些耗时操作
b.StartTimer()
for i := 0; i < b.N; i++ {
// 一些耗时操作
}
}
并行测试
签名:
func BenchmarkSplitParallel(b *testing.B) {
// b.SetParallelism(1) // 设置使用的CPU数量
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
// 一些耗时操作
}
})
}
示例测试
签名:
func ExampleName() {
// 无参数和返回值
}