原文:https://www.jianshu.com/p/b28595a281ec
Go test 的测试用例形式
测试用例有四种形式:
- TestXxxx(t *testing.T) // 基本测试用例
- BenchmarkXxxx(b *testing.B) // 压力测试的测试用例
- Example_Xxx() // 测试控制台输出的例子
- TestMain(m *testing.M) // 测试Main函数
Go test 有两种运行模式:
1、本地目录模式,在没有包参数(例如 go test
或 go test -v
)调用时发生。在此模式下,go test
编译当前目录中找到的包和测试,然后运行测试二进制文件。在这种模式下,caching 是禁用的。在包测试完成后,go test 打印一个概要行,显示测试状态、包名和运行时间。
2、包列表模式,在使用显示包参数调用 go test
时发生(例如 go test math
,go test ./...
甚至是 go test .
)。在此模式下,go 测试编译并测试在命令上列出的每个包。如果一个包测试通过,go test
只打印最终的 ok 总结行。如果一个包测试失败,go test
将输出完整的测试输出。如果使用 -bench
或 -v
标志,则 go test
会输出完整的输出,甚至是通过包测试,以显示所请求的基准测试结果或详细日志记录。
go test 的变量有哪些?
- test.short : 一个快速测试的标记,在测试用例中可以使用 testing.Short() 来绕开一些测试
- test.outputdir : 输出目录
- test.coverprofile : 测试覆盖率参数,指定输出文件
- test.run : 指定正则来运行某个/某些测试用例
- test.memprofile : 内存分析参数,指定输出文件
- test.memprofilerate : 内存分析参数,内存分析的抽样率
- test.cpuprofile : cpu分析输出参数,为空则不做cpu分析
- test.blockprofile : 阻塞事件的分析参数,指定输出文件
- test.blockprofilerate : 阻塞事件的分析参数,指定抽样频率
- test.timeout : 超时时间
- test.cpu : 指定cpu数量
- test.parallel : 指定运行测试用例的并行数
Go test flag
- -args
- -c
- -exec xprog
- -i
- -o file
- -bench regexp
- -benchtime t
- -count n
- -cover
- -covermode set,count,atomic
- -coverpkg pkg1,pkg2,pkg3
- -cpu 1,2,4
- -list regexp
- -parallel n
- -run regexp
- -short
- -timeout d
- -v
- -benchmem
- -blockprofile block.out
- -blockprofilerate n
- -coverprofile cover.out
- -cpuprofile cpu.out
- -memprofile mem.out
- -memprofilerate n
- -mutexprofile mutex.out
- -mutexprofilefraction n
- -outputdir directory
- -trace trace.out
更多中文文档:
- Go testing 源码中文文档:http://cngolib.com/testing.html
- Godoc 中文文档:https://studygolang.com/pkgdoc
什么是单元测试?
单元测试,是一种测试我们的代码逻辑有没有问题,有没有按照我们所期望的来运行,通过它来保证我们的代码质量。
顾名思义,单元测试,大多都是对某一个函数方法进行的测试,以让我们的测试粒度最细。
如何编写单元测试?
go test
可以测试 func TestXxx(*testing.T)
子测试
- https://blog.golang.org/subtests
- http://blog.studygolang.com/2017/07/subtests/
- https://blog.golang.org/subtests
如何跳过一些测试
https://stackoverflow.com/questions/24030059/skip-some-tests-with-go-test
什么是基准测试?
基准测试,是一种测试代码执行性能的方式,你可以将多种代码实现进行比对。
基准测试主要是通过测试 CPU (go test -bench . -test.cpuprofile
) 和内存 (go test -bench . --benchmem
) 的分配,来展示被测试代码的性能,进而找到性能更优的解决方案。
如何编写基准测试?
func BenchmarkXXX(b *testing.B) { }
什么是 HTTP 测试?
顾名思义,就是测试 web http 协议的测试。
如何编写 HTTP 测试?
Go 标准库为我们提供了一个 httptest 的库,通过它就能够轻松的完成 HTTP 的测试。
什么是测试覆盖率?
由单元测试的代码,触发运行到的被测试代码的代码行数占所有代码行数的比例,被称为测试覆盖率,代码覆盖率不一定完全精准,但是可以作为参考,可以帮我们测量和我们预计的覆盖率之间的差距。
go test
工具就为我们提供了一个度量测试覆盖率的能力。
go test -v -coverprofile=c.out
再通过 go tool
来将 c.out
转换成 html 格式的测试覆盖率报告。
go tool cover -html=c.out -o=tag.html
其他更多,可以参考:测试
# 生成指定 package 的测试覆盖率(fib.out 后面不带参数的,默认是命令所在目录)
$ go test -v -covermode=count -coverprofile fib.out
# 查看汇总的 fib 测试覆盖率
$ go tool cover -func=fib.out
# 生成 html
$ go tool cover -html=fib.out -o fib.html
VSCode Go Test Coverage 插件
Go Coverage Viewer is the simplest way to view your code coverage results right inside the editor
测试比较工具
- benchcmp
- benchviz
第三方测试库
参考资料
- Go 单元测试,基准测试,http 测试
- Go 测试,go test 工具的具体指令 flag
- 测试、性能测试以及代码示例的编写
- visualizing-go-benchmarks-with-benchviz
- advanced-testing-with-go / YouTube 视频
- Testing Techniques / YouTube 视频