单元测试使用 go test 命令启动,例如:
$ go test helloworld_test.go ok command-line-arguments 0.003s $ go test -v helloworld_test.go === RUN TestHelloWorld --- PASS: TestHelloWorld (0.00s) helloworld_test.go:8: hello world PASS ok command-line-arguments 0.004s代码说明如下:
第 1 行,在 go test 后跟 helloworld_test.go 文件,表示测试这个文件里的所有测试用例。
第 2 行,显示测试结果,ok 表示测试通过,command-line-arguments 是测试用例需要用到的一个包名,0.003s 表示测试花费的时间。
第 3 行,显示在附加参数中添加了-v,可以让测试时显示详细的流程。
第 4 行,表示开始运行名叫 TestHelloWorld 的测试用例。
第 5 行,表示已经运行完 TestHelloWorld 的测试用例,PASS 表示测试成功。
第 6 行打印字符串 hello world。
2) 运行指定单元测试用例go test 指定文件时默认执行文件内的所有测试用例。可以使用-run参数选择需要的测试用例单独执行,参考下面的代码。
package code11_3 import "testing" func TestA(t *testing.T) { t.Log("A") } func TestAK(t *testing.T) { t.Log("AK") } func TestB(t *testing.T) { t.Log("B") } func TestC(t *testing.T) { t.Log("C") }这里指定 TestA 进行测试:
$ go test -v -run TestA select_test.go === RUN TestA --- PASS: TestA (0.00s) select_test.go:6: A === RUN TestAK --- PASS: TestAK (0.00s) select_test.go:10: AK PASS ok command-line-arguments 0.003sTestA 和 TestAK 的测试用例都被执行,原因是-run跟随的测试用例的名称支持正则表达式,使用-run TestA$即可只执行 TestA 测试用例。
3) 标记单元测试结果当需要终止当前测试用例时,可以使用 FailNow,参考下面的代码。
func TestFailNow(t *testing.T) { t.FailNow() }还有一种只标记错误不终止测试的方法,代码如下:
func TestFail(t *testing.T) { fmt.Println("before fail") t.Fail() fmt.Println("after fail") }测试结果如下:
=== RUN TestFail before fail after fail --- FAIL: TestFail (0.00s) FAIL exit status 1 FAIL command-line-arguments 0.002s从日志中看出,第 5 行调用 Fail() 后测试结果标记为失败,但是第 7 行依然被程序执行了。
4) 单元测试日志每个测试用例可能并发执行,使用 testing.T 提供的日志输出可以保证日志跟随这个测试上下文一起打印输出。testing.T 提供了几种日志输出方法,详见下表所示。
单元测试框架提供的日志方法
方 法 | 备 注
---|---
Log | 打印日志,同时结束测试
Logf | 格式化打印日志,同时结束测试
Error | 打印错误日志,同时结束测试
Errorf | 格式化打印错误日志,同时结束测试
Fatal | 打印致命日志,同时结束测试
Fatalf | 格式化打印致命日志,同时结束测试
开发者可以根据实际需要选择合适的日志。
基准测试——获得代码内存占用和运行效率的性能数据基准测试可以测试一段程序的运行性能及耗费 CPU 的程度。Go 语言中提供了基准测试框架,使用方法类似于单元测试,使用者无须准备高精度的计时器和各种分析工具,基准测试本身即可以打印出非常标准的测试报告。
1) 基础测试基本使用下面通过一个例子来了解基准测试的基本使用方法。
package code11_3 import "testing" func Benchmark_Add(b *testing.B) { var n int for i := 0; i < b.N; i++ { n++ } }这段代码使用基准测试框架测试加法性能。第 7 行中的 b.N 由基准测试框架提供。测试代码需要保证函数可重入性及无状态,也就是说,测试代码不使用全局变量等带有记忆性质的数据结构。避免多次运行同一段代码时的环境不一致,不能假设 N 值范围。
使用如下命令行开启基准测试:
$ go test -v -bench=. benchmark_test.go goos: linux goarch: amd64 Benchmark_Add-4 20000000 0.33 ns/op PASS ok command-line-arguments 0.700s代码说明如下:
第 1 行的-bench=.表示运行 benchmark_test.go 文件里的所有基准测试,和单元测试中的-run类似。