眾所周知疲吸,golang自帶了單元測試,寫的程序都會先進行一遍單元測試誉察。最近在寫微信分享的是,簽名參數(shù)中用到了時間戳惹谐,下面的代碼持偏,在命令行執(zhí)行go test -v filename_test.go
驼卖,每次打印出來的時間戳將會是一模一樣的。
// TestSha1 ..
func TestSha1(t *testing.T) {
s := "sha1 test"
res := util.EncryptWithSha1(s)
t.Log("res:", res)
timestamp := time.Now().Unix()
t.Log(timestamp)
}
這確實有點不科學鸿秆,寫了這么多的單元測試從未出現(xiàn)過如此這樣的問題酌畜。這樣的測試幾乎可能說沒有多大意義,比如你第一次測試成功了卿叽,你改了入?yún)⒒蛘吣阏郎y試一個請求桥胞,你得到的結果仍然是后第一次一模一樣的。這段測試代碼在Vscode執(zhí)行也是一樣的附帽,但是在Goland編譯器中點擊執(zhí)行按鈕并沒有出現(xiàn)這個問題埠戳,也就是說Goland編譯器可能自動處理了井誉。執(zhí)行測試命令出現(xiàn)上面的猜測是緩存造成的蕉扮。因為從測試結果也可以看出:
PASS
ok command-line-arguments (cached)
看了看golang官方的文檔,確實緩存造成的颗圣。從Go1.10開始喳钟,測試結果將被緩存,golang緩存測試結果這點在官方文檔也能看到說明在岂。詳情見:https://golang.org/cmd/go/#hdr-Testing_flags奔则。
當go test
以包列表模式運行時,go test
會緩存成功的包的測試結果以避免不必要的重復測試蔽午。當然易茬,有時候我們測試的時候并不喜歡有緩存,我們可以手動禁用緩存及老〕槔常可以通過下列方式禁用緩存:
-
帶上-count=1參數(shù)禁用緩存。
如骄恶,執(zhí)行下面命令測試食铐,便會禁用緩存測試結果
go test -v -count=1 filename_test.go
- 手動清除測試緩存
除了在執(zhí)行測試命令的時候加上禁用緩存參數(shù),我們還可以執(zhí)行下面的命令手動清除緩存僧鲁,需要注 意的是虐呻,每次都得清除,不然下次執(zhí)行的還是上次的結果寞秃。
go clean -testcache
- 環(huán)境變量設置法
除了上面兩種方式斟叼,還可以通過環(huán)境變量來改變。我們只需要設置GOCACHE=off即可禁用緩存春寿,不過這樣執(zhí)行測試命令的時候會明顯感覺有點慢朗涩,這很正常,肯定沒有直接用緩存的結果快堂淡。但我對比了第一種方式馋缅,發(fā)現(xiàn)加行-count=1 參數(shù)這種方式比設置環(huán)境變量這種效率要高扒腕,速度要快點。
所以萤悴,在用golang測試瘾腰,千萬不要只僅僅用go test就完了,必要時還得加上需要的參數(shù)覆履,有些或許連-v參數(shù)都不會加蹋盆,事實上這樣是不會打印出log日志的。加上-count就更完美了硝全。
go test -v -count=1 filename_test.go
在VsCode中要起效栖雾,也是需要在設置中加上此參數(shù)的。如下:
"go.testFlags": ["-v","-count=1"]