参考:https://www.cnblogs.com/nickchen121/p/11517443.html
https://www.cnblogs.com/wukai66/p/12036135.html
单元测试文件的名字:*_test.go
测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头。
案例一
文件结构:
split
------spilt.go
------split_test.go
------go.mod
spilt.go
package split
import "strings"
func Split(s, sep string) (result []string) {
i := strings.Index(s, sep)
for i > -1 {
result = append(result, s[:i])
s = s[i+1:]
i = strings.Index(s, sep)
}
result = append(result, s)
return
}
split_test.go
package split
import (
"reflect"
"testing"
)
func TestSplit(t *testing.T) { // 测试函数名必须以Test开头,必须接收一个*testing.T类型参数
got := Split("a:b:c", ":") // 程序输出的结果
want := []string{"a", "b", "c"} // 期望的结果
if !reflect.DeepEqual(want, got) { // 因为slice不能比较直接,借助反射包中的方法比较
t.Errorf("excepted:%v, got:%v", want, got) // 测试失败输出错误提示
}
}
测试:
案例二
改进案例一:案例一只能根据:(长度为1 的字符串)切割
split_test.go
测试:
备注:
执行所有的单元测试:go test -v
执行指定的单元测试:go test -v -run TestMoreSplit .
案例三:测试组
代码结构:
splitmore_test.go
package split
import (
"reflect"
"testing"
)
func TestSplit(t *testing.T) {
type test struct {
input string
sep string
want []string
}
tests := map[string]test{ //测试用例使用map存储
"simple": {input: "a:b:c", sep: ":", want: []string{"a", "b", "c"}},
"wrong sep": {input: "a:b:c", sep: ",", want: []string{"a:b:c"}},
"more sep": {input: "abcd", sep: "bc", want: []string{"a", "d"}},
"leading sep": {input: "沙河有沙又有河", sep: "沙", want: []string{"", "河有", "又有河"}},
}
for name, tc := range tests {
// got := Split(tc.input, tc.sep)
// if !reflect.DeepEqual(got, tc.want) {
// t.Errorf("name:%s excepted:%#v, got:%#v", name, tc.want, got) // 将测试用例的name格式化输出
// }
t.Run(name, func(t *testing.T) { // 使用t.Run()执行子测试
got := Split(tc.input, tc.sep)
if !reflect.DeepEqual(got, tc.want) {
t.Errorf("excepted:%#v, got:%#v", tc.want, got)
}
})
}
}
#测试结果:
案例四、其他指标
测试覆盖率
将覆盖率相关的记录信息输出到一个文件
打开本地的浏览器窗口生成一个HTML报告
五、基准测试:
在一定的工作负载之下检测程序性能的一种方法。
基准测试的基本格式:
基准测试以Benchmark为前缀,需要一个*testing.B类型的参数b,基准测试必须要执行b.N次,这样的测试才有对照性,b.N的值是系统根据实际情况去调整的,从而保证测试的稳定性。
基准测试并不会默认执行,需要增加-bench参数,所以我们通过执行go test -bench=Split命令执行基准测试,
func BenchmarkName(b *testing.B){
// ...
}
BenchmarkSplit-12代表是对Split函数进行基准测试,数字12代表GOMAXPROCS的值。
5932636和198ns/op代表每次调用Split函数耗时198ns,这个结果是测试5932636后的平均值。
案例五、Fib基准测试
fib.go
package split
// Fib 是一个计算第n个斐波那契数的函数
func Fib(n int) int {
if n < 2 {
return n
}
return Fib(n-1) + Fib(n-2)
}
bech_test.go
package split
import (
"testing"
)
func benchmarkFib(b *testing.B, n int) {
for i := 0; i < b.N; i++ {
Fib(n)
}
}
func BenchmarkFib1(b *testing.B) { benchmarkFib(b, 1) }
func BenchmarkFib2(b *testing.B) { benchmarkFib(b, 2) }
func BenchmarkFib3(b *testing.B) { benchmarkFib(b, 3) }
func BenchmarkFib10(b *testing.B) { benchmarkFib(b, 10) }
func BenchmarkFib20(b *testing.B) { benchmarkFib(b, 20) }
func BenchmarkFib40(b *testing.B) { benchmarkFib(b, 40) }