前言
本专栏是笔者在学习《Go程序设计语言》这本书时,对每个章节认为较为重要(容易忘记👻)的知识点记录的笔记,其中也会有少量的思考👀, 现整理成博客分享出来。
如果对专栏感兴趣,跑过去看一眼,书中的每一章都有:《Go程序设计语言》笔记
❗️注意❗️:本专栏不是详细的知识讲解,只是碎片的知识条目,或可作为Go知识点查漏补缺的小工具~
go test工具
Go
的测试方法看起来比较低级,依赖于go test
命令,和一些能有该工具运行的测试函数编写约定;- 包目录中以
_test.go
结尾的文件不是go build
编译的目标,而是go test
编译的目标; *_test.go
文件中有三种特殊函数:功能测试函数、基准测试函数、示例函数;- 功能测试函数以Test为前缀,检测运行结果并报告
PASS
或者FAIL
; - 基准测试函数以Benchmark开头,用来测试性能,执行多次后输出平均执行时间;
- 示例函数以Example开头,用来提供机器检查过的文档;
go test
工具扫描*_test.go
文件,寻找其中的特殊函数,生成一个临时的main
包来调用他们,编译运行打印结果,最后清空临时文件;
Test函数
-
每一个测试文件必须导入
testing
包,且测试函数签名如下,其中参数t
提供了t.Error()
方法以汇报测试失败和日志记录功能;func TestName(t *testing.T){ }
-
测试函数名必须以大写开头,如
TestmyFunc
是错误的; -
go test -v
可以报告每个测试的耗时; -
可以使用基于表的测试用例:
var tests = []struct{ input string res bool }{ {"ok input", true}, {"error input", false} }
-
测试错误消息的格式一般是:
f(x)=y, want z
; -
随机测试:使用函数生成一定格式生成预知结果的随机输入;大概率用到
math/rand
包;
覆盖率
Dijkstra
:测试旨在发现bug,而不是证明其不存在;go test -cover
可以查看测试覆盖率情况;输出每条语句的执行情况;
Benchmark函数
-
基准测试函数使用如下声明:
func BenchmarkMyTest(b *testing.B){ ... }
-
testing.B
除了提供错误输出函数之外,还提供b.N
获取被执行的次数; -
go test
默认不会执行任何基准测试,而需要使用go test -bench=Test
来指定函数;
性能剖析
-
过早优化是万恶之源;
-
性能剖析分为很多种:
CPU
性能剖析、堆性能剖析、阻塞性能剖析;可通过如下语句引入:go test -cpuprofile cpu.out go test -memprofile mem.out go test -blockprofile block.out
Example函数
-
声明是没有参数也没有返回值:
func ExampleTest(){ }
-
主要目的是作为文档,其次可用于
Go Playground
,在网页上编辑和运行每个示例函数;
如有错误 ❌ ,欢迎指正 ☝️~
如有收获 🍗,可以考虑点赞👍/评论💬/收藏⭐️/关注👀,大家共同进步~