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
"""