testing
testing:
1 测试代码放在待测试代码的目录下(一个包内),以_test.go结尾
2 对于测试函数,其命名需要以“Test”开头,并且其后的字符串的第一个字符必须是大写,其次,测试函数的参数必须为(t *testing.T)
func TestUserLogin_normal(t *testing.T) {
3 go test -v .输出测试详细信息,指定函数go test -v -run funcname
4 查看测试用例覆盖率 go test -cover -coverprofile=filename.out, go tool -html =filename
eg:
被测函数:
test代码:
1,定义test结构体,包含输入,输出,
2,将测试用例组织成map,可以为用例name,value为test结构体
3,for循环开启测试,t.Run可以输出测试过程
reflect.DeepEqual()通过reflect对比两个引用型数据的底层是否相等
benchmark
被测函数还是上面split函数,benchmark代码如下
benchmark原理是执行被测函数执行足够多的次数以达到性能采样
运行:go test -bench=split
输出信息:
BenchmarkSplit-8 cpu进程数 相当于gomaxproc
10000000 执行次数
207 ns/op 每执行1次耗时
查看内存数据:go test -bench=split -benchmem
112 B/op 每执行一次消耗内存
3 allocs/op 每执行一次需要分配几次内存
以上可知,split函数每执行一次需要分配3次内存,分配内存比较耗时,分析代码,每append一次,都需要申请内存,优化代码,在函数开始先通过make申请足够的内存,避免append时重新申请
执行
结果很明显,只需要分配一次内存,性能提高一倍,内存降低将近1/3