go的测试相关内容
-
测试的意义-测试是避免事故的最后一道屏障
1)检查代码的正确性:测试可以帮助您找到代码中的错误和漏洞,并确保代码在不同环境和使用方式下都能正常工作。
2)提高代码质量:编写测试用例可以使您更好地理解代码,并帮助您编写更好的代码。测试可以帮助您发现代码中的重复、不必要的复杂性和其他问题,从而改进代码的质量和可维护性。
3)更快地发现和修复问题:测试可以帮助您快速发现代码中的问题,并快速修复它们。这样可以减少不必要的开发时间和维护成本。
4)更容易进行重构:测试可以帮助您在重构代码时快速验证代码是否仍然按照预期工作。这样可以使重构变得更加安全和可靠。 -
测试的类型
回归测试,集成测试,单元测试(依次覆盖率增加,成本降低) -
单元测试
定义:通过对一个个测试单元(函数/模块等)进行测试,将输入与期望进行校对
规则:
所有测试文件以_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)测试单元粒度要求足够小,函数职责单一
- Mock测试-含有文件操作等的测试方案(打桩测试):
import "github.com/bouk/monkey"
//将函数进行替换,将内层函数读取文件的步骤省去直接返回理想值
monkey.Patch(读取文件的函数func1,替换的函数func2)
defer monkey.Unpatch(读取文件的函数func1)
//之后正常进行单元测试
...
- 基准测试-优化代码,性能测试: 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 语言进行开发时,测试框架可以帮助您更轻松地编写、运行和管理测试用例。