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

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

WBOY
WBOYnach vorne
2024-02-11 09:42:09887Durchsuche

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

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?

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)
            }
        })
    }
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen