Go:同時執行多個套件的測試:解決爭用
在子目錄下測試多個套件時,使用go test運行單一測試會成功。但是,嘗試使用 go test ./... 同時執行所有測試會導致失敗。此問題源自於存取公共資源(例如共用資料庫)時的潛在爭用。
如果多個測試同時在同一資料庫上執行,則個別測試檔案中使用的全域變數可能會產生爭用。為了防止這種情況,請考慮使用 -parallel 1 標誌。這會強制在每個包中順序執行測試。
儘管使用 -parallel 1,測試仍可能因爭用而失敗。這表明來自不同套件的測試正在同時運行。為了消除套件之間並行的任何可能性,解決方法是使用 bash 腳本或別名手動執行測試。以下命令序列可實現此目的:
find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test
此命令列出包含 *.go 檔案的唯一子目錄,並依序對每個子目錄執行 go test。
作為替代方案,可以使用以下 shell 腳本或可以使用alias:
function gotest(){ find -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test; }
透過執行gotest .,可以順序執行目前目錄下的所有測試。
雖然不像go test ./...那麼簡單,但是這個解決方法確保測試跨包順序執行,解決並行測試執行引起的任何爭用問題。
以上是如何對多個套件依序執行 Go 測試以避免爭用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!