go test 快取
阿新 • • 發佈:2021-01-08
在執行go test的時候發現, 每次執行時間竟然一致, 然後發現是go test又快取
Go test 支援兩種模式:
- Local directory mode, 在呼叫
go test
時,沒有加引數 (比如go test
或go test -v
)。在這種模式下,快取會被禁用。 會編譯當前目錄下的程式碼和測試,然後執行測試二進位制程式。 - Package list mode,執行
go test
時,指定檔案路徑 (比如go test math
,go test ./...
)。在這種模式下,會編譯並測試路徑列出的每個測試檔案。go test
會快取成功的測試結果,以避免不必要的重複執行測試。當再次執行測試時,會檢查快取中對應的測試結果是否 OK, 如果 OK 會重新顯示之前的輸出,而不會執行測試二進位制檔案。此時go test
回過頭來再看下專案的測試指令碼:
CGO_ENABLED=1 go test -v --mod=vendor ./pkg/...
執行在 Package list mode, 所以單測通過後的二次測試, 會走 cache。
解決方案
有以下三種方式, 在測試中禁用快取:
-
執行
go test
新增--count=1
引數(推薦,效率高),以上面????例子:CGO_ENABLED=1 go test -v --count=1 --mod=vendor ./pkg/...
-
Go 官方提供 clean工具,來刪除物件檔案和快取檔案, 不過這種方式相對麻煩:
go clean -testcache // Delete all cached test results
- 設定 GOCACHE 環境變數。GOCACHE 指定了 go 命令執行時快取的路徑,以便之後被複用。 設定
GOCACHE=off
即可禁用快取。(go 1.12 之後,不能將其設定為off)
原文地址:go test 禁用測試快取 - Go語言中文網 - Golang中文社群 (studygolang.com)