首頁  >  文章  >  後端開發  >  如何在 Go 中跨多個套件運行並發測試而不發生資料庫爭用?

如何在 Go 中跨多個套件運行並發測試而不發生資料庫爭用?

DDD
DDD原創
2024-11-04 00:03:30721瀏覽

How to Run Concurrent Tests Across Multiple Packages in Go Without Database Contention?

Go:解決跨多個套件的測試並發

當測試依賴全域變數和本地資料庫伺服器時,使用go test 對子目錄下的多個套件運行測試可能會具有挑戰性。當 go test ./... 執行測試時,由於資料庫中潛在的爭用而失敗。

理解問題

問題的出現​​是因為 go test 。 /... 並行執行不同套件的測試。當每個測試檔案包含具有資料庫指標的全域變數並且測試依賴資料庫操作時,這種並行性可能會導致由於資料爭用而導致測試失敗。

潛在修復

1.序列運行測試

要強制跨包進行順序測試,請考慮在運行go test 時使用未記錄的標誌-p 1。此標誌強制所有包按順序建置和測試。

<code class="bash">go test -p 1 ./...</code>

2.使用Shell 腳本

如果-p 1 不合適,請考慮使用模擬go test ./... 行為但強制順序測試的shell 腳本。這可以透過列出帶有 *.go 檔案的子目錄、刪除重複項並對每個子目錄逐一執行 go 測試來實現。

<code class="bash">find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test</code>

3.資料庫感知測驗

另一種方法是修改測試程式碼以提高並發感知能力。這可能涉及使用包級資料庫並將資料庫初始化和拆卸分別推遲到每個測試的開始和結束。確保資料庫操作同步並且每個測試都有自己的一組資料庫資源至關重要。

範例:

以下是如何確保資料庫的範例每個測試中的隔離:

<code class="go">import (
    "database/sql"
    "testing"
)

type DBWrapper struct {
    *sql.DB
}

func (db DBWrapper) TearDown(t *testing.T) {
    if err := db.Close(); err != nil {
        t.Errorf("Failed to close database: %v", err)
    }
}

func TestDatabase(t *testing.T) {
    defer DBWrapper{sql.Open(...)}.TearDown(t)

    // Conduct test operations using the isolated DBWrapper
}</code>

透過使用這些技術,可以對涉及資料庫操作的多個套件運行測試,而不會遇到與爭用相關的故障。

以上是如何在 Go 中跨多個套件運行並發測試而不發生資料庫爭用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn