golang自帶了測試包(testing),直接可以進行單元測試、效能分析、輸出結果驗證等。簡單看著官方文件試了試,總結一下:
使用golang的測試包,需要遵循簡單的目錄結構
測試**放在待測試**的目錄下(乙個包內),以_test.go結尾,例如如下目錄結構,mytest目錄下有待測試的**檔案mytest.go和測試**mytest_test.go
.
|-- bin
| `-- main
|-- pkg
| `-- darwin_amd64
| `-- mytest.a
`-- src
|-- mytest
| |-- mytest.go
| `-- mytest_test.go
`-- main
`-- main.go
直接在mytest目錄下執行go test命令即可,go test包含很多選項,可以參考golang手冊相關部分
待測試的mytest.go原始碼如下:
package mytest
import (
"fmt"
)type mystruct struct
func getfieldvalue(x *mystruct) string
func setfieldvalue(x *mystruct, value string)
對於mytest_test.go,首先自然是要匯入golang的測試包:
package mytest
import testing
基本的測試函式以test開頭,後面接的字串,第乙個字元必須是數字或者大寫,例如:
func testmytest(t *testing.t)
}
t是testing包裡定義的乙個結構體,其包含了名為common的介面,提供了很多格式化輸出的功能,golang提供了自動檢查與呼叫測試函式的機制,測試函式的執行邏輯則需要編寫者自行完成。
執行go test 結果為:
call setfieldvalue()
pass
ok /go/src/mytest 0.004s
如果寫成testmytest,執行時會直接忽略掉該函式。得到的結果仍然為pass,但是不會列印「call setfieldvalue()」,也就是說測試函式實際沒有執行。
修改一下判斷條件:
func testmytest(t *testing.t)
}
這個測試用例不會通過, 而error函式的入參就是測試不通過時列印的資訊:
setfieldvalue()
--- fail: testmytest (0.00s)
mytest_test.go:15: set field
fail
exit status 1
fail _/users/ronghuihe/documents/code/golang/my/go/src/mytest 0.004s
這並不會中斷測試程式,這個函式後面的部分仍然會執行,其他的測試函式也會執行。
testing包還自帶了效能分析功能,可評估**執行效能。效能分析函式也可以放到前面的***_test.go檔案內,命名以benchmark開頭,如:
func benchmarkgetfieldvalue(b *testing.b)
}
其中b.n的值在執行過程中會自動調整,使得迴圈可以執行足夠多次,以便得到較為準確的單次結果:
效能分析加-bench引數執行,即go test -bench . (不能漏了最後這個點,它表示執行所有的效能測試函式)
benchmarkgetfieldvalue setfieldvalue()
setfieldvalue()
setfieldvalue()
setfieldvalue()
setfieldvalue()
setfieldvalue()
2000000000 0.55 ns/op
每次迴圈大約需要0.55ns。這裡setfieldvalue()列印了多次,是因為benchmarkgetfieldvalue被呼叫了多次。
分析testing包的原始碼benchmark.go裡的launch函式和runn函式,可以看到golang會自行調節效能分析函式的呼叫次數。每次執行runn都會執行一次效能測試函式,而後根據執行時間,會確定後續的內部迴圈執行次數b.n,直到總的執行時間達到go test -benchtime指定的時間(如果沒指定預設為1s)
注意統計時間時,執行的是使用者編寫的效能分析函式,如上例中的benchmarkgetfieldvalue,而最後輸出的結果,表達的是for迴圈裡函式的效能,因此for迴圈之前的**執行時間很長的話,可能導致統計誤差比較大,如果需要剔除for之前**的影響,可以在for迴圈之前呼叫resettimer()介面重置本次統計的時間值:
func benchmarkgetfieldvalue(b *testing.b)
}
golang基礎小結
無符號整型 uint8 uint16 uint32 uint64 帶符號整型 int8int16int32int64 uint和int具體是32位還是64位看作業系統 型別描述 uint8 無符號 8位整型 0 到 255 uint16 無符號 16位整型 0 到 65535 uint32 無符號 ...
GoLang 併發小結
006.併發 1 概念 1.1 goroutine是go並行設計的核心,goroutine的本質是輕量級執行緒 1.2 golang的runtime實現了對輕量級執行緒即goroutine的智慧型排程管理 1.3 p m g原理 1.3.1 runtime有p m g三個概念,p對應作業系統程序 對...
golang學習渠道小結
區塊鏈的底層研究和基於區塊鏈的應用開發已經越來越火熱了。一直想找找這個領域的門,目前我也在進行學習區塊鏈方面的開發,希望能和大家一起分享學習區塊鏈開發中的酸甜苦辣。今天我先來對收藏區塊鏈 以太坊中一些不錯的 資料做乙個彙總,作為入門和高階,個人感覺這些資料都是還還不錯。1.以太坊 中文版 2.go學...