测试与性能调优| 青训营

76 阅读2分钟

测试

测试可以提高代码的质量、减少事故的发生。

测试又分为:回归测试、集成测试、单元测试。

回归测试是指对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的实现原理主要是在运行时,通过Gounsafe包能够将内存中函数的地址替换为运行时函数的地址,最终调用的是打桩函数,从而实现Mock的功能。

Mock常用方法:PatchUnpatch

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:用于可视化和分析性能分析数据的工具

功能简介

QQ图片20230729130711.png

命令: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-阻塞查看