ホームページ >バックエンド開発 >Golang >型パラメータをインスタンス化せずに、Go でジェネリック関数を効果的にテーブルテストするにはどうすればよいでしょうか?

型パラメータをインスタンス化せずに、Go でジェネリック関数を効果的にテーブルテストするにはどうすればよいでしょうか?

DDD
DDDオリジナル
2024-12-04 11:09:10884ブラウズ

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

Go でのジェネリック関数のテスト

課題:

Go 1.18 ではジェネリック関数が導入されていますが、ジェネリック関数のテーブル テストを効果的に行うにはどうすればよいですかT のインスタンス化が不可能な場合の関数値?

問題ステートメント:

現在のテスト方法では、T 値をインスタンス化できないため、関数ごとにテスト ロジックを再宣言する必要があります。

アプローチ:

テストアプローチは、共通ロジックの再利用に焦点を当てるべきです。ジェネリック関数の固有の性質を考慮します。

解決策:

1.再利用可能なテスト ロジック:

テストの設定や結果の検証などの一般的な操作をカプセル化する、runTestCase[T Items](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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。