Heim > Artikel > Backend-Entwicklung > Schreiben von Unit-Tests für generische Funktionen in Golang
php-Editor Banana bringt Ihnen einen Artikel über das Schreiben von Unit-Tests für generische Funktionen in Golang. Golang ist eine stark typisierte Programmiersprache, ihre Unterstützung für Generika ist jedoch relativ schwach. Daher kann das Schreiben von Komponententests für generische Funktionen einige Herausforderungen mit sich bringen. In diesem Artikel erfahren Sie, wie Sie Unit-Tests für generische Funktionen in Golang effektiv schreiben, um die Qualität und Zuverlässigkeit Ihres Codes sicherzustellen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, erhalten Sie in diesem Artikel praktische Tipps und Methoden, die Ihnen den einfachen Umgang mit Unit-Tests generischer Funktionen erleichtern. Lass uns einen Blick darauf werfen!
Ich habe diese einfache generische Funktion, die einen Schlüssel von map
// getmapkeys returns the keys of a map func getmapkeys[t comparable, u any](m map[t]u) []t { keys := make([]t, len(m)) i := 0 for k := range m { keys[i] = k i++ } return keys }
Ich versuche, einen tabellengesteuerten Unit-Test wie folgt zu schreiben:
var testunitgetmapkeys = []struct { name string inputmap interface{} expected interface{} }{ { name: "string keys", inputmap: map[string]int{"foo": 1, "bar": 2, "baz": 3}, expected: []string{"foo", "bar", "baz"}, }, { name: "int keys", inputmap: map[int]string{1: "foo", 2: "bar", 3: "baz"}, expected: []int{1, 2, 3}, }, { name: "float64 keys", inputmap: map[float64]bool{1.0: true, 2.5: false, 3.1415: true}, expected: []float64{1.0, 2.5, 3.1415}, }, }
Der folgende Code schlägt jedoch fehl
func (us *unitutilsuite) testunitgetmapkeys() { for i := range testunitgetmapkeys { us.t().run(testunitgetmapkeys[i].name, func(t *testing.t) { gotkeys := getmapkeys(testunitgetmapkeys[i].inputmap) }) } }
und
type interface{} of testunitgetmapkeys[i].inputmap does not match map[t]u (cannot infer t and u)
Dies wurde durch die explizite Konvertierung behoben
gotKeys := getMapKeys(testUnitGetMapKeys[i].inputMap.(map[string]string))
Gibt es eine Möglichkeit, diese Tests zu automatisieren, ohne explizite Konvertierungen für jede Eingabetestvariable durchführen zu müssen?
Bitte beachten Sie, dass Sie durch das Testen der Funktion gegen verschiedene Typen keinen Gewinn erzielen, es sei denn, Ihre generische Funktion führt zusätzlich zur generischen Logik eine typspezifische Logik aus. Die allgemeine Logik der Funktion ist für alle Typen im Typsatz des Typparameters gleich, sodass sie vollständig mit einem einzigen Typ ausgeführt werden kann.
Aber wenn Sie Tests gegen verschiedene Typen durchführen möchten, können Sie einfach Folgendes tun:
var testUnitGetMapKeys = []struct { name string got any want any }{ { name: "string keys", got: getMapKeys(map[string]int{"foo": 1, "bar": 2, "baz": 3}), want: []string{"foo", "bar", "baz"}, }, { name: "int keys", got: getMapKeys(map[int]string{1: "foo", 2: "bar", 3: "baz"}), want: []int{1, 2, 3}, }, { name: "float64 keys", got: getMapKeys(map[float64]bool{1.0: true, 2.5: false, 3.1415: true}), want: []float64{1.0, 2.5, 3.1415}, }, } // ... func (us *UnitUtilSuite) TestUnitGetMapKeys() { for _, tt := range testUnitGetMapKeys { us.T().Run(tt.name, func(t *testing.T) { if !reflect.DeepEqual(tt.got, tt.want) { t.Errorf("got=%v; want=%v", tt.got, tt.want) } }) } }
Das obige ist der detaillierte Inhalt vonSchreiben von Unit-Tests für generische Funktionen in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!