go中的测试基础
相对于其他语言,go语言写一些测试代码是非常容易的,不需要引入其他任何框架 就可以很方便的完成一些单元测试
比如说 我们写一个简单的add 函数
package main
func Add(a int, b int) int {
return a + b
}
我们想测试一下这个函数
package main
import "testing"
func TestAdd(t *testing.T) {
tests := []struct{ a, b, c int }{
{1, 2, 3},
{4, 5, 9},
{0, 3, 3},
}
for _, tt := range tests {
if actual := Add(tt.a, tt.b); actual != tt.c {
t.Errorf("err add (%d %d) got %d", tt.a, tt.b, tt.c)
}
}
}
稍微注意一下命名
go语言中 我们一般是把测试的代码 命名为 xxx_test.go 同时函数的名字Test开头
可以看出来 虽然没有main函数 但是ide还是很智能的 给了我们可运行的标记
看下结果:
嗯 我们故意搞一个错误的数据 看看报错信息
有时候我们目录下可能有很多个test 都要跑,一个个run过去 很累,其实用命令也是可以的
go test .
甚至你还可以看到 代码覆盖率的 结果:
你甚至还能方便的进行 benchmark
func BenchmarkAdd(b *testing.B) {
// todo 复杂的性能测试
}
有时候 我们 在测试的时候 还需要准备一些测试数据,准备测试数据的时候还也会耗时,所以我们在数据准备完毕以后 可以调用如下代码,这样性能测试的时间点 就会在测试数据准备之后了 会非常准确
b.ResetTimer()
在goland中也将对应的go命令都封装好了 可以很方便的在ide中 对cpu 内存 等进行测试,将结果进行输出
一般情况下 做调优的时候 遵循下面的顺序
- cpuprofile 获取性能数据
- go tool pprof 查看性能数据
- 分析慢在哪里
- 优化代码
其实所有语言的性能调优都是这个流程,只是其他语言 都是要自己找一些三方库来做,而go语言直接内置了这些模块 非常方便,上手难度极低
另外对于http服务区来说,go语言还提供了内置的httptest库,方便大家测试自己的http服务器(性能和效率)
go 生成文档和代码
go doc 是生成文档,而 godoc是查看文档,要记住这2个命令
首先安装一下 gotools go install golang.org/x/tools/...@latest 然后运行下命令
那马上就可以看到对应的go doc 甚至 包括自己的代码也会自动生成
因为我们自己没有写注释 所以自然没有文档
go中的注释十分简单 只要 // 即可。不用像java语言中 那么麻烦
另外还可以给 go的函数 写一些例子代码,Example开头 即可,这样go doc也会自动 将你的例子代码 输出。