ホームページ  >  記事  >  バックエンド開発  >  リフレクションは Go で類似のシグネチャを持つ関数の単体テストをどのように合理化できますか?

リフレクションは Go で類似のシグネチャを持つ関数の単体テストをどのように合理化できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 05:31:02539ブラウズ

How Can Reflection Streamline Unit Testing for Functions with Similar Signatures in Go?

Go でのリフレクションを使用した関数のコレクションのテスト

問題

セットの単体テスト同様のシグネチャと戻り値を持つ関数を複数使用すると、反復的で煩雑になる可能性があります。従来のアプローチでは、関数ごとに個別のテストを作成する必要があるため、コードの重複が発生する可能性があります。 Reflection は、このプロセスを合理化するソリューションを提供します。

Reflection を使用したソリューション

テストでリフレクションを活用するには:

  1. Getレシーバーの値: ValueOf を使用して、テストする関数のレシーバーを表す値を取得します。
  2. 名前による関数の検索: Value.MethodByName を使用して、次の関数に対応する関数を見つけます。レシーバーの値内の特定の関数名。
  3. 関数の呼び出し: パラメーターに Value の空のスライスを渡しながら、Value.Call を使用して関数呼び出しを行います (パラメーターは予期されないため)。
  4. 戻り値の取得: Call メソッドから関数の戻り値を Value オブジェクトとして取得します。
  5. 戻り値の確認: Value.IsNil を利用して決定します。返されたエラー値が nil の場合。さらに、基本的な値チェックを使用してオブジェクトの戻り値を評価します。

コード例

<code class="go">var funcNames = []string{"Func1", "Func2", "Func3"}

func TestFunc(t *testing.T) {
    stype := reflect.ValueOf(s)
    for _, fname := range funcNames {

        fmt.Println(fname)

        sfunc := stype.MethodByName(fname)
        ret := sfunc.Call([]reflect.Value{})

        val := ret[0].Int()

        if val < 1 {
            t.Error(fname + " should return positive value")
        }
        if !ret[1].IsNil() {
            t.Error(fname + " shouldn't err")
        }

    }
}</code>

注: が無効な場合関数名を指定すると、テストがパニックになります。これを軽減するには:

<code class="go">for _, fname := range funcNames {

    defer func() {
        if x := recover(); x != nil {
            t.Error("TestFunc paniced for", fname, ": ", x)
        }
    }()
    fmt.Println(fname)
}</code>

以上がリフレクションは Go で類似のシグネチャを持つ関数の単体テストをどのように合理化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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