一、文件名必須是xxx_test.go格式
滿足此格式時,運行go test命令,會自動去識別該文件,並執行。(也可以使用go test -v 查看詳細信息)
建議比如test的目標函數是main.go中的函數,則新建test文件名稱為main_test.go
二、test文件中必須import testing包
三、test文件下的每一個test case(函數)均必須以Test開頭並且符合TestXxx形式,負責go test會直接跳過不執行。
比如 main.go中需要測試的函數是Pringt123,那么test文件中的test 函數名則建議為 TestPrint123
四、test case的入參為 t *testing.T或者b *testing.B
五、t.Errorf為打印錯誤信息,並且當前test case會被跳過
六、t.SkipNow()為跳過當前test,並且會直接按Pass處理繼續下一個test。要生效時,必須寫在第一行。
main.go
func Print1to20() int { res := 0 for i := 0; i <= 20; i++{ res += i } return res }
main_test.go
func TestPrint1to20(t *testing.T) {
res := Print1to20()
fmt.Println("Hey")
if res != 210{
t.Errorf("Wrong result of Print1to20")
}
}
七、注意要點
一個test文件中有多個test case時,如何控制執行順序
1.使用t.Run來控制執行順序和輸出
func testPrint1to20(t *testing.T) { res := Print1to20() fmt.Println("Hey") if res != 210{ t.Errorf("Wrong result of Print1to20") } } func testPrint2(t *testing.T) { res := Print1to20() fmt.Println("Hey2") res ++ if res != 211{ t.Errorf("Wrong result of Print2") } }
#使用t.Run() func TestAll(t *testing.T) { t.Run("TestPrint1to20", testPrint1to20) t.Run("TestPrint2", testPrint2) }
2.使用TestMain作為初始化test,並且使用m.Run()來調用其他tests可以完成一些需要初始化操作的testing,比如數據庫連接,文件打開等;
如果沒有在TestMain()中調用m.Run()則除了TestMain()以外其他的tests都不會被執行
func TestMain(m *testing.M) { fmt.Println("tests begin") m.Run() }
八、benchmark函數
benchmark函數一般以Benchmark開頭
benchmark的case一般會運行b.N次,每次執行都會如此
在執行過程中會根據實際case的執行時間是否穩定會增加b.N的次數以達到穩態
benchmark同樣受m.Run()方法控制