GO语言测试 | 青训营笔记

75 阅读2分钟

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

单元测试

测试规则

  • 所有测试文件用_test.go结尾
  • func TestXxx(* testing.T)
  • 初始化逻辑放到TestMain中

image.png

测试代码例子:

测试文件代码:

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]

image.png

表示通过了测试。如果更改函数返回值,测试运行如下:

image.png

actual输出是Ton但是实际上预测的是Tom,不能通过测试,Fail

覆盖率

覆盖率:被测试文件中多少百分比的代码在测试的时候被执行过了

在测试的时候加上--cover来计算覆盖率

测试运行命令行go test [xx_test.go] [xx.go] --cover

注意事项

  • 一般的测试覆盖率为:50%~60%
  • 测试分支相对独立全面覆盖
  • 测试单元粒度足够小,函数单一职责

Mock测试

如果测试依赖了文件,那么在文件被修改之后,测试将会无法通过,例如:

image.png

如果第一行line11被改成了别的内容,那么测试的时候就不能再与line00匹配,测试将无法通过,需要修改测试代码;我们可以使用mock测试避免这个问题

开源mock测试库地址:

monkey: https://github.com/bouk/monkey monkey可以对方法或者实例进行mock测试

Patch函数和Unpatch函数如下:

image.png

修改之前依赖文件的测试,让其不依赖文件内容:

image.png

这样保证读取的第一行一直是line110,不用依赖外部文件读取的数据;Patch函数将后者替换了前者,相当于为前者函数打了一个桩,Unpatch把函数上打的桩都去除

基准测试

基准测试函数以Benchmark开头,传入参数是testing.B,能计算出操作的平均运行时间

fastrand支持快速随机数