Golang测试的快速学习 | 青训营

122 阅读3分钟

go的测试相关内容

  1. 测试的意义-测试是避免事故的最后一道屏障
    1)检查代码的正确性:测试可以帮助您找到代码中的错误和漏洞,并确保代码在不同环境和使用方式下都能正常工作。
    2)提高代码质量:编写测试用例可以使您更好地理解代码,并帮助您编写更好的代码。测试可以帮助您发现代码中的重复、不必要的复杂性和其他问题,从而改进代码的质量和可维护性。
    3)更快地发现和修复问题:测试可以帮助您快速发现代码中的问题,并快速修复它们。这样可以减少不必要的开发时间和维护成本。
    4)更容易进行重构:测试可以帮助您在重构代码时快速验证代码是否仍然按照预期工作。这样可以使重构变得更加安全和可靠。

  2. 测试的类型
    回归测试,集成测试,单元测试(依次覆盖率增加,成本降低)

  3. 单元测试
    定义:通过对一个个测试单元(函数/模块等)进行测试,将输入与期望进行校对

规则:

所有测试文件以_test.go结尾
函数命名func TestXxx(*testing.T)
初始逻辑放在TestMain(*testing.M)中

EG: 有待测试函数如下

func Hello(){
    return "Hello World"
}

测试函数编写如下

import "testing"
func TestHelloTom(t *testing.T){
    output:=HelloTom()
    expecOutPut:="Tom"
    //手动判断方法
    if output!=expecOutPut{
        t.Errorln("实际结果为: ",output,"但是期望结果为: ",expecOutPut)
    }
}

运行测试函数

go test[flags][packages]

测试进阶-单元测试覆盖率(传参是否使用了全部的待测试函数代码)

import "github.com/stretchr/testify/assert"
func func1(...){
assert.Equal(t,expecOutPut,output)
}
func func2(...){
assert.Equal(t,expecOutPut,output)
}
//统计结果可以统计func1或者func2的利用率

Tips-覆盖率测试标准:

1)覆盖率50%~60%,理想的100%基本不可能
2)测试分支要求相互独立,全面覆盖
3)测试单元粒度要求足够小,函数职责单一

  1. Mock测试-含有文件操作等的测试方案(打桩测试):
import "github.com/bouk/monkey"
//将函数进行替换,将内层函数读取文件的步骤省去直接返回理想值
monkey.Patch(读取文件的函数func1,替换的函数func2)
defer monkey.Unpatch(读取文件的函数func1)
//之后正常进行单元测试
...
  1. 基准测试-优化代码,性能测试: EG: 有待测试代码:
var ServerIndex [10]int

func Index(){
    for i:=0;i<10;i++{
        ServerIndex[i]=i+100
    }
}

func Select()int{
return ServerIndex[rand.Intn(10)]
}

测试代码:

func BenchmarkSelect(b *testing.B){
    Index()
    b.ResetTimer()//重置计时开始时间
    for i:=0;i<b.N;i++{//若总测试用时不足1s,则N按照1,2,5,10,20,50...递增
        Select()
    }
}
//并发测试
...
b.ResetTimer()//重置计时开始时间
b.RunParallel(func(pb *testing.PB){
    for pb.Next(){
        Select()
    }
})

运行测试:

go test [参数]
-bench = regexp //正则匹配运行的函数
-bench . //运行所有函数
-benchmem //显示测试函数的内存分配的统计信息
-count n  //运行测试和性能多少次
-run regexp //运行特定的测试函数
-timeout t //测试时间如果超过 t 则panic,默认10min
-v //显示测试的详细信息

测试是一个非常重要的开发实践,可以帮助您编写更好的代码,并确保代码在不同环境和使用方式下都能正常工作。在使用 Go 语言进行开发时,测试框架可以帮助您更轻松地编写、运行和管理测试用例。