这是我参与「第五届青训营 」伴学笔记创作活动的第4天。
测试
1.回归测试
以手动的方式,在终端测试主流的应用场景。
2.集成测试
以系统功能维度做测试验证,如暴露的接口,自动化测试。
3.单元测试
开发者对单独的函数模块做验证。
三种测试,从上到下,覆盖率逐层变大,成本逐层降低。
4.单元测试规则
所有测试文件以 _test.go 结尾。
函数命名 func TestXxx(*testing.T)。
初始化逻辑放到 TestMain 中。
5.单元测试的覆盖率
66.7%的计算:JudgePassLine函数有三行,Test函数中传入的参数是score = 70,所以JudgePassLine函数中前两行代码运行,而函数中有三行代码,2 / 3 = 66.7%
6.单元测试-Mock
快速Mock函数:为一个函数打桩 或 为一个方法打桩。
打桩:用一个函数A替换另一个函数B,B是原函数,A是打桩函数。
如图,原函数依赖于外部文件的读取,可能被更改。在测试时,将原函数用打桩函数替换,打桩函数只会 return "line110" ,从而使得测试在任何时间进行,都不会受文件被更改的影响。
7.基准测试
benchmark基准测试
fastrand 比 rand 在高并发场景快很多。
var ServerIndex [10]int //初始化10个服务器,用数组保持他们的索引
func InitServerIndex(){
for i := 0; i < 10; i++{
ServerIndex[i] = i + 100
}
}
func Select() int {
return ServerIndex[rand.Intn(10)]
}
func FastSelect() int {
return ServerIndex[fastrand.Intn(10)]
}
func BenchmarkSelect(b *testing.B){
InitServerIndex()
b.ResetTimer()
for i := 0; i < b.N; i++{
Select()
}
}
func BenchmarkSelectParallel(b *testing.B){
InitServerIndex()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB){
for pb.Next(){
Select()
}
})
}