Golang測試用例和基準測試注意事項
阿新 • • 發佈:2019-08-01
[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()
- 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