1. 程式人生 > >go testing:單元測試

go testing:單元測試

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