go语言测试 | 青训营笔记

74 阅读2分钟

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

项目开发完后必需进行测试来保证代码的正确和功能的完整,今天的内容是go语言测试的实现方法,主要从两个方面展开:单元测试、集成测试

测试方法

1、单元测试

单元测试(unit testing),是指对代码中的可测试单元进行检查和验证。一般而言直接理解成对具体的函数进行测试,与之相对比的还有回归测试和集成测试,其中单元测试是覆盖率最大、成本最低的测试方式
运行测试代码使用go test命令,该命令会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件,所以测试文件需要命名成对应的格式
此外每个测试用例函数需要以 Test 为前缀,所有在以_test结尾的源码文件中以 Test 开头的函数会自动被执行,初始化逻辑代码可以放在TestMain方法中。可以使用assert方法编写相关判断语句。
示例代码如下:
func HelloTom() string {
    return "Tom"
}
import (
    "github.com/stretchr/testify/assert"
    "testing"
)
    
func TestHelloTom(t *testing.T) {
    output := HelloTom()
    expectOutput := "Tom"
    assert.Equal(t, expectOutput, output)
}

衡量测试代码质量一般用覆盖率表示,一般完整项目的覆盖率大概在50%~60%为宜

2、Mock测试

Mock测试实际上是单元测试的一种方法,mock本意是能够模仿真实对象行为的模拟对象,比如,当我们需要测试一个模块A,但该模块A有其他依赖,而依赖本身可能又调用了其他依赖库,这时把完整的依赖树构建出来是低效的,所以将紧邻的依赖用mock替代,对于模块A而言紧邻的依赖仅是预期结果的返回接口,以及某些情况下,对象本身难以被创建,也可以用mock对象替代,创建mock对象的过程称为打桩。也就是说mock对象不是待测对象,而往往是待测对象依赖的对象或者函数

golang中可以使用monkey作为打桩工具,但monkey不是线程安全的,不能用于并发的单元测试中

3、基准测试

基准测试用于测试程序运行时的性能以及CPU的耗费程度,优化代码时往往需要对当前代码分析,同时内置的测试框架可以实现基准测试。可以使用testing包中内置的功能实现基准测试,示例代码如下:
func BenchmarkFib20(b *testing.B) {
    for n := 0; n < b.N; n++ {
        Fib(20) //执行b.N次Fib函数
    }
}

总结

测试对于整个开发过程是必须的,既能保证功能的正常运行,同时能为代码优化提供参考