本文摘自网络,作者,侵删。
- http://c.biancheng.net/view/124.html
- https://geektutu.com/post/geecache-day2.html
Golang拥有一套单元测试和性能测试系统 - go test
命令
- 单元测试(UT, unit testing)
单元测试是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义。
单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
- 性能测试
性能测试又称为基准测试,是一种测试代码执行性能的方式。
基准测试主要是通过测试CPU和内存的分配来展示被测试代码的性能,进而找到性能更优的解决方案。
测试命令
- 测试文件名必须为
*_test.go
go test
命令会自动读取源码目录下名为*_test.go
的文件,生成并运行测试用的可执行文件。
$ go help test
$ go help testflag
执行模式
go test
具有两种执行模式
- 本地目录模式
local mode
本地模式即直接cd
到特定目录中运行go test
,不用指定目录。
在没有包参数(例如go test
或go test -v
)调用时发生,在此模式下go test
编译当前目录中找到的包和测试,然后运行测试二进制文件。在本地目录模式下缓存是禁用的。包测试完成后go test
会打印一行概要,显示测试状态、包名、运行时间。
- 包列表模式
package list mode
在任意目录中运行go test
,需指定要测试的package
目录。
在使用显示包参数调用go test
时发生,例如go test math
、go test ./
...甚至是go test .
。在此模式下go
测试编译并测试在命令行列出每个包。如果一个包测试通过,go test
只打印最终的ok
总结行。如果一个包测试失败,go test
将输出完整的测试输出。如果使用-bench
或-v
标志则go test
会输出完整的输出,甚至是通过包测试,以显示锁请求的基准测试结果或详细日志记录。
在local mode
中无缓存功能,在package list mode
中测试成功的会被缓存,若后续没有改过测试函数,也没有改过被测试函数,那么将直接使用缓存的结果以加速整个测试。
// 清理所有缓存,包括测试缓存。
$ go clean -cache
//只清理测试缓存
$ go clean --testcache
测试用例
在*_test.go
文件中有三种类型的函数:测试函数、基准测试、示例函数
- 功能测试:函数名必须以
Test
开头,函数参数必须是*testing.T
。测试成立逻辑行为是否正确。 - 性能测试:函数名必须以
Benchmark
开头,函数参数必须是*testing.B
。测试函数的性能。 - 示例测试:函数名必须以
Example
开头,函数参数无要求。为文档提供示例文档。
测试函数中某条测试用例执行结果与预期不符可调用t.Error()
或t.Errorf()
方法记录日志并标记测试失败
测试用例具有四种形式
- 基本测试用例:
TestXxx(t *testing.T)
- 压力测试用例:
BenchmarkXxx(b *testing.B)
- 测试控制台输出:
Example_Xxx()
- 测试主函数:
TestMain(m *testing.M)
功能测试
- 功能测试用于测试程序的一些逻辑行为是否正确
-
go test
命令会调用测试函数并报告测试结果是PASS
或FAIL
- 每个功能测试函数必须导入
testing
包 - 功能测试函数是以
Test*
为函数前缀的函数,但首字母不能是小写字母。
$ vim ./test/cache_test.go
package test
import (
"fmt"
"testing"
)
func TestMain(m *testing.M) {
fmt.Printf("test main\n")
m.Run()
}
func TestCache(t *testing.T) {
fmt.Printf("Test Cache\n")
}
测试文件以TestMain
函数作为初始化test
的入口,可以在m.Run()
函数前完成初始化操作。若没有TestMain
中调用m.Run()
则除了TestMain()
以外的其他test都不会执行。如果没有重写TestMain()
则默认都会执行test。
测试整个文件
$ go test
test main
Test Cache
PASS
ok gfw/test 0.291s
显示测试详情
- 直接输入
go test
不会打印t.Log
记录的信息,打印日志可采用go test -v
。 -
go test -v
显示测试的详细命令
$ go test -v
test main
testing: warning: no tests to run
PASS
ok gfw/test 0.293s
测试单个文件需要带上被测试的源文件
$ go test -v cache_test.go
test main
=== RUN TestCache
Test Cache
--- PASS: TestCache (0.00s)
PASS
ok command-line-arguments 0.294s
-
PASS
表示测试成功 -
ok
表示测试通过,command-line-arguments
表示测试用例需要用到的一个包名,0.294s
表示测试耗费的时长。
测试单个函数
-
go test
指定文件时默认会执行文件内的所有测试用例 -
go test -run
可使用-run
参数选择需要的测试用例单独执行
$ go test -v cache_test.go -test.run TestCache
test main
=== RUN TestCache
Test Cache
--- PASS: TestCache (0.00s)
PASS
ok command-line-arguments 0.291s
单元测试日志
- 每个测试用例可能并发执行,使用
testing.T
提供的日志输出可以保证日志跟随测试上下文一起打印输出。 -
testing.T
提供的日志输出方法
日志方法 | 描述 |
---|---|
Log | 打印日志,同时结束测试。 |
Logf | 格式化打印日志,同时结束测试。 |
Error | 打印错误日志,同时结束测试。 |
Errorf | 格式化打印错误日志,同时结束测试。 |
Fatal | 打印致命日志,同时结束测试。 |
Fatalf | 格式化打印致命日志,同时结束测试。 |
相关阅读 >>
更多相关阅读请进入《Go》频道 >>

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