1. 程式人生 > >Golang測試用例和基準測試注意事項

Golang測試用例和基準測試注意事項

[TOC]

Golang測試用例和基準測試注意事項

老生常談了,這裡主要記錄一下,測試用例(test)和壓力測試(benchmark)中的注意事項

test測試用例

  • 測試用例的檔名必須以XXX_test.go的格式.
  • 檔名的XXX不必一定和被測試檔案的名稱一樣,但是保持一致是一個很好的習慣.
  • 測試用例中的測試函式名必須是TestXXX(t *testing.T)如此定義,否則不執行
  • 每一個test檔案必須要import一個testing
  • go test或者go test -v命令測試當前包目錄下的所有的tests
  • t.Errorf來列印錯誤資訊,會輸出錯誤資訊,並且跳過當前測試函式
  • t.SkipNow()
    跳過當前測試並且直接按PASS處理繼續下一個test
  • go的test不會保證多個TestXXX()是順序執行的,但是通常會順序執行
  • 要保持順序執行需要使用subTest,即在test內使用t.Run()來順序呼叫要測試的test函式,一般被呼叫的test,會把函式名定位testXXX,這樣的話就不會自動執行testXXX,而是被t.Run()來呼叫
  • 使用TestMain(m *tesging.M)作為初始話test,並且使用m.Run()來呼叫其他test可以完成一些初始話操作的testing,該函式必須呼叫m.Run()
  • 如果沒有在TestMain中呼叫m.Run()則除了testMain之外的所有其他test都不會執行
package main
import(
    "testing"
    "fmt"
)

//因為是小寫開頭所以不會執行
func testPrint(t *testing.T){
//該方法可以跳過當前函式的測試,並通過測試
    t.SkipNow()
    res := MyFunc()
    if res {
        t.Errorf("wrong")
    }
}
//因為是小寫開頭所以不會執行
func testprint1(t *testing.T){
    res := MyFunc()
    if !res {
        t.Errorf("wrong 1")
    }
}

func TestAll(t *testing.T){
    //使用t.Run()呼叫函式來做順序執行
    t.Run("TestPrint",  testPrint)
    t.Run("TestPrint1", testPrint1)
}

//初始化函式,首先執行該函式
func TestMain(m *testing.M){
    fmt.Println("this is Main func")
    //必須要呼叫該函式,否則除了TestMain()其他函式都不會執行
    m.Run()
}

benchMark基準測試

  • benchmark函式需要Benchmaik開頭
  • benchmark的case標準一般會跑b.N次,而且每次執行都是如此
  • 在執行中會根據實際的case執行時間是否是穩定的,會一直增加b.N的次數以達到執行時間是一種穩定的狀態.比如說第一次我們執行10nm,第二次100nm,第三次300nm,那他就不會停止,會一直增加.等到平均每次執行的時間趨近於穩定他才會停
  • 在我們的函式測試時,千萬注意被測試函式總能在一定時間內達到一種穩態,否則會永遠執行不完
func noSteady(n int) int{
    for n >0 {
        n --
    }
    return n
}

func steady(n int){
return
}

func BenchmarkAll(b *testing.B){
    for n:=0;n<b.N;n++{
    //會永遠跑不完,因為我們每次穿進去的n是不一樣的,
    //而且該函式是線性增長的,比如2就執行2次,3就執行3次,等於N的時候就執行N次
    //那麼這時候b.N就會不斷的調大以適應裡面n的變化
    //最終永遠也跑不完
        noSteady(n)
        //肯定可以跑完
        steady