首頁 >後端開發 >Golang >在不實例化型別參數的情況下,如何有效地對 Go 中的泛型函數進行表格測試?

在不實例化型別參數的情況下,如何有效地對 Go 中的泛型函數進行表格測試?

DDD
DDD原創
2024-12-04 11:09:10878瀏覽

How Can We Effectively Table Test Generic Functions in Go Without Instantiating Type Parameters?

在Go 中測試泛型函數

挑戰:

Go 1.18 引入了泛型,但是如何有效地泛型對泛型進行表測試當 T無法實例化時的函數

問題陳述:

由於無法實例化 T 值,目前的測試方法需要重新聲明每個函數的測試邏輯。

方法:

測試方法應著重於重複使用常見的邏輯,同時考慮泛型函數的特定性質。

解決方案:

1.可重複使用的測試邏輯:

建立一個通用的測試函數,例如runTestCase [T Item](tc testCase[T]),它封裝了設定測試和驗證結果等常見操作。

2。實例化注意事項:

泛型函數最終必須使用特定型別進行實例化。但是,沒有必要測試每個可能的類型參數。

3.專注於類型特定的行為:

僅當特定類型的行為因運算子語義而不同時,才專注於測試特定類型的函數。例如,數字和字串的運算符,或數字和字串的比較運算符。

範例:

此測試程式碼使用通用 runTestCase 函數來測試不同類型商店地圖中的值的數量:

func TestStore(t *testing.T) {
    t.Run("ints", testInt)
    t.Run("strings", testString)
}

func testString(t *testing.T) {
    t.Parallel()
    tests := []testCase[string]{
        {
            start:    store[string]{},
            key:      123,
            val:      "test",
            expected: store[string]{123: "test"},
        },
        // ...
    }
    for _, tc := range tests {
        t.Run(tc.name, runTestCase(tc))
    }
}

func testInt(t *testing.T) {
    t.Parallel()
    tests := []testCase[int]{
        {
            start:    store[int]{},
            key:      123,
            val:      456,
            expected: store[int]{123: 456},
        },
        // ...
    }
    for _, tc := range tests {
        t.Run(tc.name, runTestCase(tc))
    }
}

以上是在不實例化型別參數的情況下,如何有效地對 Go 中的泛型函數進行表格測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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