这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
测试是保证代码质量的最后一道屏障,事实上有许多项目因为测试不够完善而造成大量的损失.
测试分为三种,回归测试,集成测试,单元测试,覆盖率及成本均为从左向右依次增加.
单元测试
单元测试规范
- 所有测试文件以_tset.go结尾
- 测试函数名称为
func TestXxx(* Testing.T),驼峰命名法. - 初始化逻辑放到
TestMain()中
单元测试-覆盖率
- 测试函数中执行了源文件函数代码行数的百分率
覆盖率tips
- 一般覆盖率: 50~60%,较高覆盖率能达到80%
- 测试分支相互独立,全面覆盖
- 测试单元粒度足够小,函数单一职责.
mock机制-保证测试的幂等性与稳定性
graph TD
单元 --> Flie
单元 --> Db
单元 --> Cache
有时我们的代码需要引用外部依赖,但这些外部依赖可能会被修改从而使我们的代码运行失败.这时用到了mock机制
快速mock函数
// Patch replaces a function with another
func Patch(target, replacement interface{}) *PatchGuard {
t := reflect.ValueOf(target)
r := reflect.ValueOf(replacement)
patchValue(t, r)
return &PatchGuard{t, r}
}
// Unpatch removes any monkey patches on target
// returns whether target was patched in the first place
func Unpatch(target interface{}) bool {
return unpatchValue(reflect.ValueOf(target))
}
作用: 对函数或方法打桩(打桩就是用新的自定义函数替代原来的函数)
基准测试
函数名:func BenchmarkXxxxxx(b *testing.B)
Xxxxx即为要测试的函数
示例
func Select(){...}
func BenchmarkSelect(b *testing.B){
Init()//可能存在的前期准备工作
b.Resettimer()
for i := 0;i < b.N; i++ {
Select()
}
}
- 基准测试的入参是testing.B 用b中的N值进行循环测试
- 对一个测试用例的默认测试时间为1s,当测试用例函数返回时还不到1s,那么b.N将递增,直到达到1s
b.Resettimer()重置计数器,前期的Init()等准备操作不应划到基准测试的范围