这是我参与「第五届青训营 」笔记创作活动的第3天
单元测试
测试规则
- 所有测试文件用_test.go结尾
- func TestXxx(* testing.T)
- 初始化逻辑放到TestMain中
测试代码例子:
测试文件代码:
func TestMain(m *testing.M) {
//数据装载等操作
code := m.Run()
//释放资源等操作
os.Exit(code)
}
func TestHelloTom(t *testing.T) {
output := HelloTom()
expectOutput := "Tom"
if output != expectOutput {
// t.Errorf("Expected %s do not match actual %s", expectOutput, output)
assert.Equal(t, expectOutput, output)
}
}
main.go内定义一个函数:
func HelloTom() string {
return "Tom"
}
测试运行如下: go test [flag] [package]
表示通过了测试。如果更改函数返回值,测试运行如下:
actual输出是Ton但是实际上预测的是Tom,不能通过测试,Fail
覆盖率
覆盖率:被测试文件中多少百分比的代码在测试的时候被执行过了
在测试的时候加上--cover来计算覆盖率
测试运行命令行go test [xx_test.go] [xx.go] --cover
注意事项
- 一般的测试覆盖率为:50%~60%
- 测试分支相对独立全面覆盖
- 测试单元粒度足够小,函数单一职责
Mock测试
如果测试依赖了文件,那么在文件被修改之后,测试将会无法通过,例如:
如果第一行line11被改成了别的内容,那么测试的时候就不能再与line00匹配,测试将无法通过,需要修改测试代码;我们可以使用mock测试避免这个问题
开源mock测试库地址:
monkey: https://github.com/bouk/monkey monkey可以对方法或者实例进行mock测试
Patch函数和Unpatch函数如下:
修改之前依赖文件的测试,让其不依赖文件内容:
这样保证读取的第一行一直是line110,不用依赖外部文件读取的数据;Patch函数将后者替换了前者,相当于为前者函数打了一个桩,Unpatch把函数上打的桩都去除
基准测试
基准测试函数以Benchmark开头,传入参数是testing.B,能计算出操作的平均运行时间
fastrand支持快速随机数