package fib
import"testing"// 当传入的数据量不同, 测试函数运算的耗时// 这个 benchmark 是小写, 用于调用funcbenchmarkFib(b *testing.B, n int){for i :=0; i < b.N; i++{Fib(n)}}funcBenchmarkFib2(b *testing.B){benchmarkFib(b,2)}funcBenchmarkFib20(b *testing.B){benchmarkFib(b,20)}funcBenchmarkFib100(b *testing.B){benchmarkFib(b,200)}
设置 cpu 数量, 清除耗时
// 设置 cpu 数量
b.SetParallelism(1)// 清除上边代码的耗时
b.ResetTimer()
测试前后加操作
全局前后增加操作 - TestMain
funcTestMain(m *testing.M){
fmt.Println("start test...")
r := m.Run()
fmt.Println("end test...")
os.Exit(r)}
单一用例前后增加操作 - setup 和 teardown
package split
funcTestMultiSplit(t *testing.T){
f :=setupT(t)deferf(t)
get :=Split("a::b::c","::")
want :=[]string{"a","b","c"}if ok := reflect.DeepEqual(get, want);!ok {
t.Fatalf("期望结果: %v, 实际结果: %v\n", want, get)}else{
t.Log("pass test...")}}// 给单一测试用例加前后操作, 如果是性能测试, t 改 b 即可funcsetupT(t *testing.T)func(t *testing.T){
t.Log("start test...")// 测试前执行returnfunc(t *testing.T){// 返回函数名, 使用时 defer 调用
t.Log("end test...")}}
运行测试
单元测试
go test -v # 输出详细信息# 函数形式 子测试
go test -run=None -v # 函数名字包含 None 的测试用例# 组形式 子测试
go test -run Split/None -v # 函数名/用例名, 如果有多个组, 需要声明函数名, 否则可以省略# 测试覆盖率
go test -cover
# 将覆盖率输出到文件
go test -cover -coverprofile=c.out
# 将文件内容输出到浏览器
go tool cover -html=c.out
# 如果遇到如下报错说明目录下没有 go 的二进制文件, 添加即可
cover: cannot run go list: fork/exec /usr/local/go/bin/go: no such file or directory
基准测试
# -bench 指定测试的函数, . 表示所有
go test -bench=.
# 可以指定使用几个cpu, 输出内存信息等
go test -bench=Split -cpu=2 -benchmem
"""
结果展示:
goos: darwin
goarch: amd64
pkg: code.oldboy.com/split
# 使用了 4 个 cpu 测试次数 每次操作消耗时间 每次操作占用字节数 每次操作申请内存次数
BenchmarkSplit-4 3000000 420 ns/op 112 B/op 3 allocs/op
PASS
ok code.oldboy.com/split 1.710s
"""
练习 - 回文判断
palindrome.go
package palindrome
import("fmt""unicode")// 需求: 判断是否为回文字符串// 1. 需要去除标点 unicode.IsLetter 判断// 2. 需要忽略大小写 unicode.ToLower 转换funcisPalindrome(s string)bool{// 用于存放"词语"var letters []rune// 遍历字符串for_, l :=range s {// 判断是否为"词语", 是的话处理大小写, 添加进lettersif unicode.IsLetter(l){// 处理大小写
newL := unicode.ToLower(l)// 加入切片
letters =append(letters, newL)}}// 遍历判断
l :=len(letters)for i :=0; i < l/2; i++{if letters[i]!= letters[l-i-1]{returnfalse}}returntrue}