go test的坑

衆所周知,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會緩存成功的包的測試結果以免沒必要要的重複測試。固然,有時候咱們測試的時候並不喜歡有緩存,咱們能夠手動禁用緩存。能夠經過下列方式禁用緩存:單元測試

  • 帶上-count=1參數禁用緩存。

    如,執行下面命令測試,便會禁用緩存測試結果測試

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"]
相關文章
相關標籤/搜索