平常开发中, 测试是不能缺乏的,每次手动测试很是费时费力,经过单元测试能够达到一次实现屡次利用;框架
单元测试主要是经过模拟业务中的参数,调用咱们的函数,而后获取执行结果,再判断结果是否符合规则;同时还能够对某一个方法进行性能分析函数
在Go 标准库中有一个叫作 testing
的测试框架, 能够用于单元测试和性能测试. 它是和命令 go test
集成使用的,测试文件是之后缀 _test.go
命名的, 一般和被测试的文件放在同一个包中.工具
单元测试咱们大部分状况下无需增长或修改业务代码,只需增长单元测试代码便可,在这个实验过程当中,咱们简单编写一个简单的业务代码,用来模拟项目中的业务代码;而后再添加单元测试代码进行测试。性能
咱们找一个空文件夹,新建一个main.go文件,在文件中将一下代码复制进去并保存单元测试
package main func Sum(count int) int { count-- return count }
接着咱们继续在当前文件夹下新建单元测试代码,按照简介中的规则,咱们须要新建一个名为main_test.go
的文件,而后在文件中编写测试代码,示例代码以下测试
package main import ( "testing" ) //单元测试 func TestSum(t *testing.T) { //准备参数 param := 10 //执行函数 ret := Sum(param) //判断结果是否符合预期 if ret != 9 { t.Error("Sum result failed") } } //性能测试 func BenchmarkSum(b *testing.B) { //准备参数 param := 10 //执行函数 for i := 0; i < b.N; i++ { Sum(param) } }
普通测试主要是验证返回的结果是否符合预期,执行的命令以下所示spa
go test -v main_test.go main.go
命令执行后,返回的结果以下所示翻译
从上图中能够看到,单元测试提示测试经过,说明咱们程序符合预期指针
性能测试主要是经过屡次调用程序,总耗时来分析程序的性能,相似于AB压力测试,执行命令以下所示code
go test -v -bench="BenchmarkSum$" --run=none main_test.go main.go
命令中的-bench="BenchmarkSum$"
参数表明要窒息哪个方法,执行结果以下所示
在上图中能够看到程序被调用了1000000000次,平均耗时0.254ns
性能分析主要是查看方法中具体的瓶颈,好比A方法调用了C、B、D多个方法,具体耗时在什么位置,咱们能够在上一条性能测试的命令中加入-cpuprofile cpu.out
参数(文章附录有多种分析指标类型)加入到性能测试中的具体信息保存
go test -v -bench="BenchmarkSum$" --run=none -cpuprofile cpu.out main_test.go main.go
经过go 自带工具分析保存的文件
go tool pprof cpu.out
命令执行以后返回信息以下图所示
经过第三方工具视图分析
apt install graphviz && go tool pprof -http=":" cpu.out
命令执行以后,会返回一个localhost域名加随机端口的网址,打开网址以后,能看到以下信息,由于我测试的方法比较简单
各参数含义翻译
-blockprofile block.out
将goroutine阻塞配置文件写入指定文件 当全部测试完成时。 按照-c的方式编写测试二进制文件。
-blockprofilerate n
控制细节提供的goroutine阻塞配置文件 调用运行时。SetBlockProfileRate与n。 参见" go doc run . setblockprofilerate " 剖析器的目标是平均每一个阻塞事件采样一次 n纳秒的程序花费被阻塞。默认状况下, 若是以及。块配置文件没有设置这个标志,全部的阻塞事件 ,至关于-test.blockprofilerate=1。
-coverprofile cover.out
在全部测试经过后,向文件写入覆盖率配置文件。 设置覆盖。
-cpuprofile cpu.out
退出前将CPU配置文件写入指定文件。 按照-c的方式编写测试二进制文件。
-memprofile mem.out
经过全部测试后,将分配配置文件写入该文件。 按照-c的方式编写测试二进制文件。
-memprofilerate n
启用更精确(和昂贵)的内存分配配置文件 设置runtime.MemProfileRate。参见" go doc run . memprofilerate "。 要配置全部内存分配,使用-test.memprofilerate=1。
-mutexprofile mutex.out
将互斥锁争用配置文件写入指定文件 当全部测试完成时。 按照-c的方式编写测试二进制文件。
-mutexprofilefraction n
样本1在n堆栈的踪影goroutines持有a 争用互斥锁。
做者:汤青松
日期:2020-08-11