go测试|青训营笔记

136 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

测试是保证代码质量的最后一道屏障,事实上有许多项目因为测试不够完善而造成大量的损失.
测试分为三种,回归测试,集成测试,单元测试,覆盖率及成本均为从左向右依次增加.

单元测试

单元测试规范

  1. 所有测试文件以_tset.go结尾
  2. 测试函数名称为 func TestXxx(* Testing.T),驼峰命名法.
  3. 初始化逻辑放到 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()等准备操作不应划到基准测试的范围