Go语言-测试 | 青训营笔记

66 阅读1分钟

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

测试

1.回归测试

以手动的方式,在终端测试主流的应用场景。

2.集成测试

以系统功能维度做测试验证,如暴露的接口,自动化测试。

3.单元测试

开发者对单独的函数模块做验证。

屏幕截图_20230127_175324.png

三种测试,从上到下,覆盖率逐层变大,成本逐层降低。

4.单元测试规则

所有测试文件以 _test.go 结尾。

函数命名 func TestXxx(*testing.T)。

初始化逻辑放到 TestMain 中。

屏幕截图_20230127_175842.png

5.单元测试的覆盖率

屏幕截图_20230127_180206.png

66.7%的计算:JudgePassLine函数有三行,Test函数中传入的参数是score = 70,所以JudgePassLine函数中前两行代码运行,而函数中有三行代码,2 / 3 = 66.7%

6.单元测试-Mock

屏幕截图_20230127_195320.png

快速Mock函数:为一个函数打桩 或 为一个方法打桩。

打桩:用一个函数A替换另一个函数B,B是原函数,A是打桩函数。

屏幕截图_20230127_215547.png

如图,原函数依赖于外部文件的读取,可能被更改。在测试时,将原函数用打桩函数替换,打桩函数只会 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()
        }
    })
}