这是我参与「第五届青训营」伴学笔记创作活动的第 4 天
项目开发完后必需进行测试来保证代码的正确和功能的完整,今天的内容是go语言测试的实现方法,主要从两个方面展开:单元测试、集成测试
测试方法
1、单元测试
单元测试(unit testing),是指对代码中的可测试单元进行检查和验证。一般而言直接理解成对具体的函数进行测试,与之相对比的还有回归测试和集成测试,其中单元测试是覆盖率最大、成本最低的测试方式
运行测试代码使用go test命令,该命令会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件,所以测试文件需要命名成对应的格式
此外每个测试用例函数需要以 Test 为前缀,所有在以_test结尾的源码文件中以 Test 开头的函数会自动被执行,初始化逻辑代码可以放在TestMain方法中。可以使用assert方法编写相关判断语句。
示例代码如下:
运行测试代码使用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不是线程安全的,不能用于并发的单元测试中
golang中可以使用monkey作为打桩工具,但monkey不是线程安全的,不能用于并发的单元测试中
3、基准测试
基准测试用于测试程序运行时的性能以及CPU的耗费程度,优化代码时往往需要对当前代码分析,同时内置的测试框架可以实现基准测试。可以使用testing包中内置的功能实现基准测试,示例代码如下:
func BenchmarkFib20(b *testing.B) {
for n := 0; n < b.N; n++ {
Fib(20) //执行b.N次Fib函数
}
}
总结
测试对于整个开发过程是必须的,既能保证功能的正常运行,同时能为代码优化提供参考