1. 程式人生 > 實用技巧 >go test 快取

go test 快取

在執行go test的時候發現, 每次執行時間竟然一致, 然後發現是go test又快取

Go test 支援兩種模式:

  1. Local directory mode, 在呼叫go test時,沒有加引數 (比如go testgo test -v)。在這種模式下,快取會被禁用。 會編譯當前目錄下的程式碼和測試,然後執行測試二進位制程式。
  2. Package list mode,執行go test時,指定檔案路徑 (比如go test math,go test ./...)。在這種模式下,會編譯並測試路徑列出的每個測試檔案。go test會快取成功的測試結果,以避免不必要的重複執行測試。當再次執行測試時,會檢查快取中對應的測試結果是否 OK, 如果 OK 會重新顯示之前的輸出,而不會執行測試二進位制檔案。此時go test
    會列印 '(cached)' 標識。

回過頭來再看下專案的測試指令碼:

CGO_ENABLED=1 go test -v --mod=vendor ./pkg/... 

執行在 Package list mode, 所以單測通過後的二次測試, 會走 cache。

解決方案

有以下三種方式, 在測試中禁用快取:

  1. 執行go test新增--count=1引數(推薦,效率高),以上面????例子:

    CGO_ENABLED=1 go test -v --count=1 --mod=vendor ./pkg/... 
  2. Go 官方提供 clean工具,來刪除物件檔案和快取檔案, 不過這種方式相對麻煩:

    go clean -testcache // Delete all cached test results
  3. 設定 GOCACHE 環境變數。GOCACHE 指定了 go 命令執行時快取的路徑,以便之後被複用。 設定GOCACHE=off即可禁用快取。(go 1.12 之後,不能將其設定為off)

原文地址:go test 禁用測試快取 - Go語言中文網 - Golang中文社群 (studygolang.com)