同様のシグネチャと戻り値を持つ複数の関数をテストする場合、関数ごとに個別のテストを記述するのは面倒です。 Go では、リフレクションによって、これらの関数をまとめてテストするためのソリューションが提供されます。
次のシグネチャを持つ関数のセット (Func1、Func2、...) を考えてみましょう。
func YourFunction() (int, error)
目標: この一連の関数を反復処理し、各関数を呼び出し、特定の条件での戻り値をテストするテストを作成します。
リフレクションを使用すると、実行時に値や関数にアクセスして操作できるようになります。レシーバーのreflect.Valueオブジェクトを作成すると、対応する関数を見つけて、reflect.Value.MethodByNameを使用して呼び出すことができます。返された値が正しいかどうかを検査できます。
次に、リフレクションを利用して、指定されたインターフェイスを持つすべての関数をテストするテストの例を示します。
<code class="go">func TestFunc(t *testing.T) { var funcNames = []string{"Func1", "Func2", "Func3"} stype := reflect.ValueOf(s) // receiver for _, fname := range funcNames { sfunc := stype.MethodByName(fname) ret := sfunc.Call([]reflect.Value{}) val := ret[0].Int() err := ret[1] if val < 1 { t.Error(fname + " should return positive value") } if !err.IsNil() { // checks for a nil error t.Error(fname + " shouldn't err") } } }</code>
リフレクションを使用して存在しない関数を呼び出すとパニックが発生することに注意してください。これに対処するには、遅延関数と回復を使用してパニックをキャッチし、より有益なエラー メッセージを提供できます。
リフレクションを利用し、例外を適切に処理することで、次のような単一のテストを作成できます。同様の動作を持つ複数の関数を効率的にテストすることで、反復的なテスト コードの必要性を減らし、テストの堅牢性を確保します。
以上がGo で類似したシグネチャを持つ複数の関数を効率的にテストするためにリフレクションをどのように使用できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。