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,目的是写一些实例文档。
测试函数
左侧代码是主程序,右侧代码为测试程序
在demo1.go中,定义了个Split函数,作用是分割字符串,返回分割后的字符串数组
在demo1_test.go中,定义了一个开头为大写的TestSplit函数,参数为指针类型的*testing.T。
直接在demo1_test.go中使用方法来验证输出结果是否正确。
可以看到分割的内容是符合自己想要的,也就是说函数是没有问题的。
在输出的结果当中,显示了测试的结果是OK,执行时间0.026s
还有一个测试是want,约定了是got变量和want变量
got表示需要测试的值
want表示期望获取的值
还是以上面的为例,进行go want测试
表格驱动测试用于测试大量的测试使用
在右侧demo1_test.go中,
9行:定义了一个结构体列表,字段为s 和sep
13行:声明一个变量tests,类型为结构体切片,并对其赋值
19行:使用for range对tests进行循环,获取值
20行、21行:测试Split函数,并输出内容
或者用下面的方法可以显示详细的测试过程
Demo1_test.go中t.Run(strconv.Itoa(i), func(t *testing.T) {}可以显示详细的测试过程。
检查测试代码的覆盖率
在执行结果中,coverage: 100.0% of statements表示每一行的代码都被执行过了,覆盖率是100%。
检查覆盖率也可以通过可视化的检查
第一步:$ go test -cover -coverprofile=c.out,将测试结果输出到c.out文件中
第二步:$ go tool cover -html=c.out,以html的形式展示测试结果
可以看到红色部分是没有覆盖的地方,蓝色部分是覆盖的地方。
基准测试
执行命令:$ go test -bench=Split
其中Split是测试的函数
在执行结果中:BenchmarkSplit-4表示CPU的核心是4核心, 7316653表示执行的次数, 164.3 ns/op表示每执行一次用的时间,1.400s,表示一共消耗的时间。
在执行命令$ go test -bench=Split -benchmem中,可以显示内存消耗。
48 B/op 表示每次执行消耗的内存,2 allocs/op表示每次执行申请的内存次数