测试
测试可以提高代码的质量、减少事故的发生。
测试又分为:回归测试、集成测试、单元测试。
回归测试是指对QA手动回归一些特定场景,可以理解为我们说的手动点点。
集成测试是指对系统功能维度做验证,比如对服务暴露的接口验证,一般是自动化的验证。
单元测试是指在开发阶段,开发者对单独的函数、模块做验证,写一些测试用例
单元测试组成部分:输入、输出、测试单元、与期望的校对,测试单元又包括函数、接口、模块、复杂的聚合函数等。
通过单元测试的输出再与期望输出进行校对,来验证代码的正确性。通过单元测试可以保证代码的质量,也可以在一定程度上提升效率,比如通过运行单元测试可以快速定位到有问题的代码。
规则
·1所有测试文件以_test.go结尾
func Textxx(*testing.T)
初始化逻辑放到TestMain中
func TestMain(m *testing.M){
//
code := m.Run()
//测试后释放资源
os.Exit(code)
}
import "testing"
func TestHelloTom(t *testing.T) {
output := HelloTom()
expectOutPut := "Tom"
if output != expectOutPut {
t.Errorf("Expected %s do not match actual %s", expectOutPut, output)
}
}
func HelloTom() string {
return "Jerry"
}
如果单元测试用到数据库、redis等,在单元测试里直接连接会涉及到网络传输,这是不稳定的,所以要用到Mock机制。
开源Mock框架:github.com/bouk/monkey
这个Mock包可以对函数或方法进行打桩,打桩就是用一个函数A来替换一个函数B。
monkey的实现原理主要是在运行时,通过Go的unsafe包能够将内存中函数的地址替换为运行时函数的地址,最终调用的是打桩函数,从而实现Mock的功能。
Mock常用方法:Patch、Unpatch。
Patch方法有两个参数,target为替换的函数(原函数),replacement为要替换成的函数。
func Patch(target, replacement interface{}) *PatchGuard {
t := reflect.ValueOf(target)
r := reflect.ValueOf(replacement)
patchValue(t, r)
return &PatchGuard{t, r}
}
性能调优
性能分析工具pprof:用于可视化和分析性能分析数据的工具
功能简介
命令:topN 用于查看占用资源最多的函数
flat:当前函数本身的执行耗时
flat%
cum:当前函数本身加上其调用函数的总耗时
flat == cum 没有调用其他函数
flat == 0 只有其他函数的调用
list 查找特定代码行
web:调用关系可视化
heap 查看堆内存
go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"
top视图类似上面说的topN,查看内存占用
block-阻塞查看