go测试 | 青训营笔记

61 阅读1分钟

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

测试分类

  1. 回归测试:手动回归主流场景进行测试
  2. 集成测试:系统功能维度,自动化的测试
  3. 单元测试:开发者对某个功能模块验证

单元测试

image.png

规则:

  1. 所有测试文件以_test.go结尾
  2. func TestXxx(*testing.T)
  3. 初始化的逻辑放到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) 
}

image.png

代码覆盖率

image.png image.png 因为只执行了代码的前两行,没有测试过return false,所以代码覆盖率位66.7% Tips:

  1. 一般的覆盖率50%~60%,较高达到80%
  2. 测试分支相互独立全面覆盖
  3. 测试单元粒度足够细,函数单一职责

MOCK测试:

有些时候测试依赖于本地的文件、数据库等,当环境变化就会导致测试的结果失效,从而不具备幂等性 image.png 此时就需要进行MOCK测试: github.com/bouk/monkey

  1. 对函数、方法打桩
  2. 用老的函数地址替换新的函数,从而实现mock测试 image.png image.png

基准测试:

测试一段程序运行时的性能与CPU的损耗,定位问题 eg:随机选择一个服务器做负载均衡 image.png image.png

  1. 可以看到多协程并行的情况下,其CPU是存在劣化的(正常来讲,并行应该是串行的10倍左右)
  2. 原因是因为:rand随机数生成为保护其并发安全持有一把全局锁 image.png