Go(或Golang)是Google在2007年开发的一种开源编程语言,出自RobertGriesemer、RobPike和KenThompson之手。2009年11月10日,GoogleOpenSourceBlog向全球发布了这款语言:公告指出Go的主要目标是“兼具Python等动态语句的开发速度和C或C++等编译型语言的性能与安全性”。

单元测试testing,测试函数、表格驱动测试、检查代码覆盖率、基准测试性能

单元测试

在Go语言中,单元测试使用gotest命令。

在包目录中,以_test.go结尾的源代码就是gotest的一部分。

*_test.go有三种类型,分别是测试函数、基准函数、示例函数。

测试函数的函数名前缀是Test,目的是测试程序的逻辑性为。

基准函数的函数名前缀是Benchmark,目的是测试程序的性能。

示例函数的函数名前缀是Example,目的是写一些实例文档。

测试函数

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

左侧代码是主程序,右侧代码为测试程序

在demo1.go中,定义了个Split函数,作用是分割字符串,返回分割后的字符串数组

在demo1_test.go中,定义了一个开头为大写的TestSplit函数,参数为指针类型的*testing.T。

直接在demo1_test.go中使用方法来验证输出结果是否正确。

可以看到分割的内容是符合自己想要的,也就是说函数是没有问题的。

在输出的结果当中,显示了测试的结果是OK,执行时间0.026s

还有一个测试是want,约定了是got变量和want变量

got表示需要测试的值

want表示期望获取的值

还是以上面的为例,进行go want测试

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

表格驱动测试用于测试大量的测试使用

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

在右侧demo1_test.go中,

9行:定义了一个结构体列表,字段为s 和sep

13行:声明一个变量tests,类型为结构体切片,并对其赋值

19行:使用for range对tests进行循环,获取值

20行、21行:测试Split函数,并输出内容

或者用下面的方法可以显示详细的测试过程

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

Demo1_test.go中t.Run(strconv.Itoa(i), func(t *testing.T) {}可以显示详细的测试过程。

检查测试代码的覆盖率

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

在执行结果中,coverage: 100.0% of statements表示每一行的代码都被执行过了,覆盖率是100%。

检查覆盖率也可以通过可视化的检查

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

第一步:$ go test -cover -coverprofile=c.out,将测试结果输出到c.out文件中

第二步:$ go tool cover -html=c.out,以html的形式展示测试结果

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

可以看到红色部分是没有覆盖的地方,蓝色部分是覆盖的地方。

基准测试

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

执行命令:$ go test -bench=Split

其中Split是测试的函数

在执行结果中:BenchmarkSplit-4表示CPU的核心是4核心, 7316653表示执行的次数, 164.3 ns/op表示每执行一次用的时间,1.400s,表示一共消耗的时间。

Go语言编程从入门到精通(单元测试、检查覆盖率、基准测试)

在执行命令$ go test -bench=Split -benchmem中,可以显示内存消耗。

48 B/op 表示每次执行消耗的内存,2 allocs/op表示每次执行申请的内存次数