这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
测试
1. 单元测试
- 所有测试文件以_test.go结尾
- 测试函数 func TestXxx(t *testing.T)
func TestAdd(t *testing.T){ ... }
- 初始化逻辑放到TestMain中
func TestMain(m * testing.M){
//测试前:数据装载,配置初始化等前置工作
code := m.Run()
//测试后:释放资源等收尾工作
os.Exit(code)
}
运行 go test [flags][packages]
覆盖率 --cover
tips
- 一般覆盖率:50%~60%,较高覆盖率80%+;
- 测试分支相互独立,全面覆盖;
- 测试单元粒度足够小,函数单一职责
单元测试-依赖
依赖 => 幂等 稳定
幂等 = 多次测试结果相同;
稳定 = 单元测试之间是相互隔离的,任何时间任何函数独立运行
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. 项目实战-分层结构
| 数据层 | 数据Model,外部数据的增删改查 |
| 逻辑层 | 业务Entity,处理核心业务逻辑输出 |
| 视图层 | 视图View,处理外部的交互逻辑 |