Golang筆記之testing
摘要:
Go工具鏈
常用命令
build
buildcompile packages and dependencies
最常用的go command之一,編譯go檔案
跨平臺編譯: env GOOS=linux GOARCH=amd64 go bui...
Go工具鏈
常用命令
- build
buildcompile packages and dependencies 最常用的go command之一,編譯go檔案 跨平臺編譯: env GOOS=linux GOARCH=amd64 go build
- install
installcompile and install packages and dependencies 也是編譯,與build最大的區別是編譯後會將輸出檔案打包成庫放在pkg下 常用於本地打包編譯的命令: go install
- get
getdownload and install packages and dependencies 用於獲取go的第三方包,通常會預設從git repo上pull最新的版本 常用命令如: go get -u github.com/go-sql-driver/mysql (從github上獲取mysql的driver並安裝到本地)
- fmt
fmtgofmt (reformat) package sources 類似於C中的lint, 統一程式碼風格和排版 常用命令如: go fmt
- test
testtest packages 運行當前包目錄下的tests 常用命令如: go test 或go test -v等
golang的test
main.go main_test.go
- Go的test一般以xxx_test.go為檔名
- xxx的部分一般為xxx_test.go所要測試的程式碼檔名
- Go並沒有特別要求xxx的部分必須是要測試的檔名
- go test -v
package main import ( "testing" "fmt" ) func TestPrint(t *testing.T){ res := Print1to20() fmt.Println("hey") if res != 210{ t.Errorf("Wrong result of Print1to20") } }
2-2 golang專案中test的寫法
Test的寫法
- 每一個test檔案必須import一個testing
- test檔案下的每一個test case必須均以Test開頭並且符合TestXxxx形式,否則go test會直接跳過測試不執行
- test case的入參為t *testing.T或者 b *testing.B
- t.Errorf為列印錯誤資訊,並且當前test case會被跳過
- t.SkipNow()為跳過當前test,並且直接按PASS處理繼續下一個test
- t.SkipNow() 寫在等一行
Test注意要點
- Go的test不會保證多個TestXxx順序執行,但是通常會按順序執行
- 使用t.Run來執行subtests可以做到控制test輸出以及test的順序
// 順序執行 func TestPrintSub(t *testing.T){ t.Run("a1",func(t *testing.T){fmt.Println("a1")}) t.Run("a2",func(t *testing.T){fmt.Println("a2")}) t.Run("a3",func(t *testing.T){fmt.Println("a3")}) }
- 使用TestMain作為初始化test,並且使用m.Run()來呼叫其他tests可以完成一些需要初始化操作的testing,
- 比如資料庫連線,檔案開啟,Rest服務登入等
// TestMain func TestMain(m *testing.M){ fmt.Println("test main first") m.Run() }
- 如果沒有在TestMain中呼叫m.Run()則除了TestMain以外的其他tests都不好被執行
2-3 golang專案中benchmark的寫法
Test之benchmark
- benchmark函式一般以Benchmark開頭
- benchmark的case一般會跑b.N次,而且每次執行都會如此
- 在執行過程中會根據實際case的執行時間是否穩定會增加b.N的次數以達到穩態
// go test -bench=. func BenchmarkAll(b *testing.B){ for n := 0; n < b.N; n++{ Print1to20() } }
- 執行命令go test -bench=.
- 傳參要保證函式穩態