Go语言进阶与测试 | 青训营笔记

49 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

go语言进阶与依赖管理

go并发

  1. 协程是用户态的,轻量级别,栈KB级别;线程是内核态的,比较重,MB级别。

  2. 协程之间尽量使用CSP的形式进行通信,即通过chan;如果使用共享内存,需要注意并发安全的问题,一般采用sync.Mutex来上锁。

  3. 协程任务中,需要阻塞来进行并发任务管理;

    可以通过sync.WaitGroup来阻塞管理。waitGroup本质维护一个协程计数器,开启协程,计数器Add加协程数,退出一个协程,计数器Done减1,Wait()为0,退出。

go依赖管理

历史方案

  1. GOPATH

    全局src管理库,导致版本会有冲突。

  2. GO Venfor

    项目vendor目录保存该项目的依赖副本,项目优先从vendor寻找依赖包。 缺点是:如果本项目的依赖库之间如果有冲突,编译会有问题。

  3. Go Module

    通过go.mod管理依赖包版本,通过go get/go mod管理依赖包

    中心管理仓库Proxy依赖分发:GOPROXY = "url1,urls2,direct"

    go get url@版本分支

    go mod init/download/tidy

Go工程实践-测试

回归测试、集成测试、单元测试

单元测试-规则:

  1. 测试文件以_test.go结尾
  2. 测试函数以TestNnn(t *testing.T)方式
  3. 初始化逻辑通过TestMain(m *testing.M)
    func TestMain(m *testing.M) {
        // pre action
        code := m.Run()
        // after action
        os.Exit(code)
    }
    
    // go test file_test.go
    
    断言包:"github.com/stretchr/testify/assert";使用类似python的assert.Equal()

代码覆盖率
go test file_test.go --cover

  • 覆盖率是指测试代码所测试的代码的覆盖率
  • 提升覆盖率,对不同分支都均进行测试

单元测试-依赖

有一些函数依赖外部的文件或者数据库以及网络之类,造成测试时,不能保证结果的稳定和幂等。此时可以使用mock对函数进行打桩;这样可以把对代码的测试和外部依赖剥离开,解决依赖不稳定的问题。

mock:github.com/bouk/monkey

基准测试

func BenchmarkNnn(b *testing.B){
    b.ResetTimer()
}