这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
测试分类
- 回归测试:手动回归主流场景进行测试
- 集成测试:系统功能维度,自动化的测试
- 单元测试:开发者对某个功能模块验证
单元测试
规则:
- 所有测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化的逻辑放到TestMain()中
例子:
go test [falgs] [packages]
单元测试的函数:
func HelloTom() string {
return "Jerry"
}
测试函数:
func TestHelloTom(t *testing.T) string {
output := HelloTom()
expectOutput := "Tom"
if output != expectOutput
t.Errorf("Expected %s do not match actual %s", expectOutput, output)
}
代码覆盖率
因为只执行了代码的前两行,没有测试过return false,所以代码覆盖率位66.7%
Tips:
- 一般的覆盖率50%~60%,较高达到80%
- 测试分支相互独立全面覆盖
- 测试单元粒度足够细,函数单一职责
MOCK测试:
有些时候测试依赖于本地的文件、数据库等,当环境变化就会导致测试的结果失效,从而不具备幂等性
此时就需要进行MOCK测试:
github.com/bouk/monkey
- 对函数、方法打桩
- 用老的函数地址替换新的函数,从而实现mock测试
基准测试:
测试一段程序运行时的性能与CPU的损耗,定位问题
eg:随机选择一个服务器做负载均衡
- 可以看到多协程并行的情况下,其CPU是存在劣化的(正常来讲,并行应该是串行的10倍左右)
- 原因是因为:rand随机数生成为保护其并发安全持有一把全局锁