go后端工程实践之测试 | 青训营笔记

60 阅读1分钟

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

测试

image.png

1. 单元测试

  1. 所有测试文件以_test.go结尾
  2. 测试函数 func TestXxx(t *testing.T)
func TestAdd(t *testing.T){ ... }
  1. 初始化逻辑放到TestMain中
func TestMain(m * testing.M){
    //测试前:数据装载,配置初始化等前置工作
    code := m.Run()
    //测试后:释放资源等收尾工作
    os.Exit(code)
}

运行 go test [flags][packages]
覆盖率 --cover

tips

  • 一般覆盖率:50%~60%,较高覆盖率80%+;
  • 测试分支相互独立,全面覆盖;
  • 测试单元粒度足够小,函数单一职责

单元测试-依赖

image.png 依赖 => 幂等 稳定
幂等 = 多次测试结果相同;
稳定 = 单元测试之间是相互隔离的,任何时间任何函数独立运行

Mock

为一个函数打桩(替换),进而不依赖本地文件

2. 基准测试

  • 优化代码,需要对当前代码分析
  • 内置测试框架提供了基准测试的能力
  • 函数开头以Benchmark
func BenchmarkConcatStringByAdd(b *testing.B){
    //与测试性能无关的代码
    b.ResetTimer()
    for i := 0; i < b.N;i++{
        //测试代码
    }
    b.stopTimer()
    //与测试性能无关的代码
}

rand函数保证并发安全性和全局随机性,持有一把全局锁,降低了并发的性能(多协程)
为了解决随机函数性能问题, 使用开源代码fastrand函数 github.com/bytedance/g…
运行所有基准测试
go test -bench=.

3. 项目实战-分层结构

image.png

数据层数据Model,外部数据的增删改查
逻辑层业务Entity,处理核心业务逻辑输出
视图层视图View,处理外部的交互逻辑