課題:
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 サイトの他の関連記事を参照してください。