Heim > Backend-Entwicklung > Golang > Schreiben von Unit-Tests für generische Funktionen in Golang

Schreiben von Unit-Tests für generische Funktionen in Golang

WBOY
Freigeben: 2024-02-11 09:42:09
nach vorne
1019 Leute haben es durchsucht

在 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!

Frageninhalt

Ich habe diese einfache generische Funktion, die einen Schlüssel von map

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

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

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

und

type interface{} of testunitgetmapkeys[i].inputmap does not match map[t]u (cannot infer t and u)
Nach dem Login kopieren

Dies wurde durch die explizite Konvertierung behoben

gotKeys := getMapKeys(testUnitGetMapKeys[i].inputMap.(map[string]string))
Nach dem Login kopieren

Gibt es eine Möglichkeit, diese Tests zu automatisieren, ohne explizite Konvertierungen für jede Eingabetestvariable durchführen zu müssen?

Problemumgehung

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

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!

Quelle:stackoverflow.com
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