标记单元测试结果
- 当需要终止当前测试用例时可使用
t.FailNow()
方法 - 当只需要标记错误而不终止测试可采用
t.FailNow()
方法
package test
import (
"testing"
)
func TestCache(t *testing.T) {
t.Log("TEST CACHE START...")
t.FailNow()
t.Log("TEST CACHE END...")
}
$ go test -v -run TestCache cache_test.go
=== RUN TestCache
cache_test.go:8: TEST CACHE START...
--- FAIL: TestCache (0.00s)
FAIL
FAIL command-line-arguments 0.306s
FAIL
基准测试 - benchmark test
基准测试框架对一个测试用例的默认测试时间为1秒,开始测试时当以Benchmark
开头的基准测试用例函数返回时还不到1秒,那么testing.B
中的N值将按1、2、5、10、20、50...递增,同时以递增后的值重新调用基准测试用例函数。
- 基准测试可测试一段程序的运行性能及耗费CPU的程度
-
go test
工具提供了压力测试功能的支持 -- benchmark test -
go test
的基准测试提供了将目标代码执行N次统计运行时间从而实现压测的功能
与单元测试类似只要在项目的*_test.go
文件中写入BenchmarkXxx(b *testing.B)
函数即可实现基准测试函数的编写。执行基准测试命令go test -bench=.
即可获取测试结果。
- 测试文件必须以
*_test.go
结尾 - 测试文件必须导入
testing
包 - 测试函数名必须以
Benchmark
开头,函数签名必须接收一个指向testing.B
类型的指针,无返回值。 - 测试函数循环上限为
b.N
package test
import (
"fmt"
"testing"
)
func BenchmarkCache(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Printf("%v\n", i)
}
}
例如:
$ vim ./test/cache_test.go
package test
import (
"fmt"
"testing"
)
func BenchmarkCache(b *testing.B) {
fmt.Printf("%v\n", "BENCHMARK...")
}
$ go test -bench=BenchmarkCache -benchmem -benchtime=10s
BENCHMARK...
goos: Windows/">windows
goarch: amd64
pkg: gfw/test
BenchmarkCache-6 BENCHMARK...
BENCHMARK...
BENCHMARK...
BENCHMARK...
BENCHMARK...
1000000000 0 B/op 0 allocs/op
PASS
ok gfw/test 0.298s
意味着基准测试函数在测试时间内循环了1000000000次
go test -bench=".*" [-v]
目录下全部单元测试和基准测试
可通过-bench=BenchmarkXxx
目录下指定基准测试函数
$ go test -bench=BenchmarkCache
可通过-benchtime
来指定测试的执行时间,默认不小于1秒。
$ go test -bench=. -benchtime=20s
可通过-benchmem
显示每次操作分配内存的次数(allocs/op)和字节数(B/op)。
$ go test -bench=. -benchmem
控制计数器
当测试需要一定的启动和初始化时间,若从Benchmark()
函数开始计时时会很大成都上影响测试结果的精准性。
testing.B
提供了一系列的方法可以方便地控制计时器,从而让计时器只在需要的区间进行测试。
package test
import (
"testing"
)
func BenchmarkCache(b *testing.B) {
//b.ResetTimer()//重置计时器
//b.StopTimer() //停止计时器
//b.StartTimer() //开始计时器
}
并行执行测试 - Parallelizing tests
默认情况下,指定包的测试是按照顺序执行的,但也可以通过测试的函数内部使用t.Parallel()
来标志某些测试也可以被安全的并发执行。
package test
import (
"testing"
)
func TestParallel(t *testing.T) {
t.Parallel()
}
在并行执行的情况下,只有当那些被标记为并行的测试才会被并行执行,所以只有一个测试函数时是没有意义的。它应该在测试函数中第一个被调用,因为它会重置测试时间。
在并发情况下,同时运行的测试的数量默认取决于GOMAXPROCS
,可通过-parallel n
被指定。
$ go test -parallel 4
另外,一个可以实现并行的方法,尽管不是函数级力度,但却是包级粒度,类似执行go test p1 p2 p3
,即同时执行多个测试包。在这种情况下,包会被先编译,并同时被执行。当然,这对于总的时间来说是有好处的。但它也可能会导致错误变得具有不可预测性。比如一些资源被多个包同时使用时。
为了保持可控性,-p
标志可以用来指定编译和测试的并发数。当仓库中有多个测试包,并且每个包在不同的子目录中,一个可以执行所有包的命令是go test ./...
,这包含当前目录和所有子目录。没有带-p
标志执行时,总的运行时间应该接近于运行时间最长的包的时间(加上编译时间)。
$ go test -p 1 .
运行go test -p 1 ./...
使编译和测试工具只能在一个包中执行时,总的时间应该接近于所有独立的包测试的时间加上编译的时间综合。
本文来自:简书
感谢作者:JunChow520
查看原文:Go Test
相关阅读 >>
Go-carbon 1.3.1 版本发布,新增 diffforhumans() 方法和多语言支持
更多相关阅读请进入《Go》频道 >>

Go语言101
一个与时俱进的Go编程知识库。