摘自:https://www.liwenzhou.com/posts/Go/16_test/
新建Split
package split
import "strings"
//传入Split("a:b:c",":")返回("a","b","c")
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
}
对于每个go文件我们可以建立单元测试文件*_test.go
建立split_test.go
package split
import (
"reflect"
"testing"
)
func TestSplit(t *testing.T) {
type test struct {
input string //传入的字符串
sep string //按照sep分割
want []string //预期结果
}
tests := map[string]test{
"simple": test{"a:b:c", ":", []string{"a", "b", "c"}},
"mulit sep": test{"abcd", "bc", []string{"a", "d"}},
} //建立两组测试样例
for name, test := range tests {
t.Run(name, func(t *testing.T) {
got := Split(test.input, test.sep)
if !reflect.DeepEqual(got, test.want) {
t.Errorf("name %s failed,want: %v, got: %v", name, test.want, got)
}
})
}
}
右键打开该目录终端
不同的指令
-
go test -v 查看每个测试样例的情况 (需要调用t.Run)
-
go test -run=Split/simple 测试具体某个测试样例
-
go test -cover(查看代码覆盖率)
-
go test -cover -coverprofile=c.out(可视化查看代码覆盖率,先生成c.out文件)go tool cover -html=c.out(以html的形式查看c.out文件)
性能测试
func BenchmarkSplit(b *testing.B) {
for i := 0; i < b.N; i++ {
Split("a:b:c", ":")
}
}
-
输入 go test -bench=Split
BenchmarkSplit-4:当前操作系统采用的线程个数为4
5935716:执行了这么多次
195.3 ns/op:每一次操作花费了195.3ns
-
go test -bench=Split -benchmem(查看内存消耗)
112 B/op:每一次操作(调用一次该函数为一次操作)消耗112字节
3 allocs/op:每一次操作申请3次内存
经过分析得出:上述代码的每次append都会申请一次内存,优化方法:在开始处就申请好ret的容量,后面每次append就不会再申请内存了!
package split
import "strings"
//传入Split("a:b:c",":")返回("a","b","c")
func Split(s, sep string) (result []string) {
result = make([]string, 0, strings.Count(s, sep)+1)//优化代码
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
}
对于一个acmer来说太喜欢了!!!这个优化太棒了