衆所周知,golang自帶了單元測試,寫的程序都會先進行一遍單元測試。最近在寫微信分享的是,簽名參數中用到了時間戳,下面的代碼,在命令行執行go test -v filename_test.go
,每次打印出來的時間戳將會是如出一轍的。golang
// TestSha1 .. func TestSha1(t *testing.T) { s := "sha1 test" res := util.EncryptWithSha1(s) t.Log("res:", res) timestamp := time.Now().Unix() t.Log(timestamp) }
這確實有點不科學,寫了這麼多的單元測試從未出現過如此這樣的問題。這樣的測試幾乎可能說沒有多大意義,好比你第一次測試成功了,你改了入參或者你正測試一個請求,你獲得的結果仍然是後第一次如出一轍的。這段測試代碼在Vscode執行也是同樣的,可是在Goland編譯器中點擊執行按鈕並無出現這個問題,也就是說Goland編譯器可能自動處理了。執行測試命令出現上面的猜想是緩存形成的。由於從測試結果也能夠看出:緩存
PASS ok command-line-arguments (cached)
看了看golang官方的文檔,確實緩存形成的。從Go1.10開始,測試結果將被緩存,golang緩存測試結果這點在官方文檔也能看到說明。詳情見:https://golang.org/cmd/go/#hdr-Testing_flags。微信
當go test
以包列表模式運行時,go test
會緩存成功的包的測試結果以免沒必要要的重複測試。固然,有時候咱們測試的時候並不喜歡有緩存,咱們能夠手動禁用緩存。能夠經過下列方式禁用緩存:單元測試
如,執行下面命令測試,便會禁用緩存測試結果測試
go test -v -count=1 filename_test.go
除了在執行測試命令的時候加上禁用緩存參數,咱們還能夠執行下面的命令手動清除緩存,須要注 意的是,每次都得清除,否則下次執行的仍是上次的結果。命令行
go clean -testcache
除了上面兩種方式,還能夠經過環境變量來改變。咱們只須要設置GOCACHE=off便可禁用緩存,不過這樣執行測試命令的時候會明顯感受有點慢,這很正常,確定沒有直接用緩存的結果快。但我對比了第一種方式,發現加行-count=1 參數這種方式比設置環境變量這種效率要高,速度要快點。日誌
因此,在用golang測試,千萬不要只僅僅用go test就完了,必要時還得加上須要的參數,有些或許連-v參數都不會加,事實上這樣是不會打印出log日誌的。加上-count就更完美了。code
go test -v -count=1 filename_test.go
在VsCode中要起效,也是須要在設置中加上此參數的。以下:文檔
"go.testFlags": ["-v","-count=1"]