go testing:單元測試
阿新 • • 發佈:2018-12-22
Test & Benchmark
- 原始碼檔名需要以”_test.go”結尾
- 放置於需要測試模組的相同目錄下
- 在build時會忽略所有test檔案
Tests
定義
func TestXxx(*testing.T)
Benchmarks
定義
func BenchmarkXxx(*testing.B)
例子
func BenchmarkBigLen(b *testing.B) { big := NewBig() b.ResetTimer() //如果之前有耗費時間的啟動設定,可以重置計算時間 for i := 0; i < b.N; i++ { big.Len() } }
func BenchmarkTemplateParallel(b *testing.B) { templ := template.Must(template.New("test").Parse("Hello, {{.}}!")) b.RunParallel(func(pb *testing.PB) { var buf bytes.Buffer for pb.Next() { buf.Reset() templ.Execute(&buf, "World") } }) }
Examples
定義
func ExampleXxx()
例子
//結束行需要有Output:開頭的註釋,用來比對標準輸出(std.out)(忽略開頭和結尾的空格) func ExampleSalutations() { fmt.Println("hello, and") fmt.Println("goodbye") // Output: // hello, and // goodbye }
命名規範
//suffix:在有多個example函式時,表示一個包/函式/型別/方法的名稱 func Example_suffix() { ... } //package的example func ExampleF_suffix() { ... } //函式的example func ExampleT_suffix() { ... } //型別的example func ExampleT_M_suffix () { ... }//方法的example
當一個test檔案沒有包含test或benchmark函式時,包含至少一個example函式,則認為是一個example檔案
Subtests & Sub-benchmarks
作用
- 增加了test的分層
- 可以共享setup(設定)和tear-down(銷燬)過程
例子
//依次執行Subtests func TestFoo(t *testing.T){ //setup code t.Run("A=1",func(t *testing.T){...}) t.Run("A=2", func(t *testing.T) { ... }) t.Run("B=1", func(t *testing.T) { ... }) //tear-down code }
//並行執行Subtests func TestGroupedParallel(t *testing.T) { for _, tc := range tests { tc := tc // capture range variable t.Run(tc.Name, func(t *testing.T) { t.Parallel() //subtests彼此並行 ... }) } }
//Run在所有subtests完成前不會返回 func TestTeardownParallel(t *testing.T) { // This Run will not return until the parallel tests finish. t.Run("group", func(t *testing.T) { t.Run("Test1", parallelTest1) t.Run("Test2", parallelTest2) t.Run("Test3", parallelTest3) }) // }
Main
作用
- 開始測試時,首先執行TestMain
- 相當與測試的主執行緒
- 在TestMain中可以做一些Setup和Tear-down
- 最後應該使用os.Exit退出
例子
func TestMain(m *testing.M){ flag.Parse() os.Exit(m.Run()) }
go test命令
go test -run Foo # Run top-level tests matching "Foo". go test -run Foo/A= # Run subtests of Foo matching "A=". go test -run /A=1 # Run all subtests of a top-level test matching "A=1".