Heim > Backend-Entwicklung > Golang > Wie können wir generische Funktionen effektiv in Go testen, ohne Typparameter zu instanziieren?

Wie können wir generische Funktionen effektiv in Go testen, ohne Typparameter zu instanziieren?

DDD
Freigeben: 2024-12-04 11:09:10
Original
870 Leute haben es durchsucht

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

Generische Funktionen in Go testen

Herausforderung:

Go 1.18 führt Generika ein, aber wie können Sie Generika effektiv in der Tabelle testen? Funktionen, wenn Instanziierung für T-Werte nicht möglich ist?

Problem Aussage:

Aktuelle Testmethoden erfordern eine Neudeklaration der Testlogik für jede Funktion, da T-Werte nicht instanziiert werden können.

Ansatz:

Der Testansatz sollte sich auf die Wiederverwendung gemeinsamer Logik konzentrieren und gleichzeitig die Besonderheiten des Generikums berücksichtigen Funktionen.

Lösung:

1. Wiederverwendbare Testlogik:

Erstellen Sie eine generische Testfunktion wie runTestCase[T Item](tc testCase[T]), die allgemeine Vorgänge wie das Einrichten von Tests und das Überprüfen von Ergebnissen kapselt.

2. Überlegungen zur Instanziierung:

Generische Funktionen müssen schließlich mit bestimmten Typen instanziiert werden. Es ist jedoch nicht notwendig, jeden möglichen Typparameter zu testen.

3. Konzentrieren Sie sich auf typspezifisches Verhalten:

Konzentrieren Sie sich nur dann auf das Testen von Funktionen für bestimmte Typen, wenn sich deren Verhalten aufgrund der Operatorsemantik unterscheidet. Zum Beispiel der Operator für Zahlen und Zeichenfolgen oder Vergleichsoperatoren für Zahlen und Zeichenfolgen.

Beispiel:

Dieser Testcode verwendet die generische runTestCase-Funktion, um verschiedene Typen zu testen von Werten in einer Filialkarte:

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))
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie können wir generische Funktionen effektiv in Go testen, ohne Typparameter zu instanziieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage