Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menulis ujian unit untuk fungsi generik dalam golang

Menulis ujian unit untuk fungsi generik dalam golang

WBOY
WBOYke hadapan
2024-02-11 09:42:09887semak imbas

在 golang 中为泛型函数编写单元测试

editor php Banana membawakan anda artikel tentang menulis ujian unit untuk fungsi generik di Golang. Golang ialah bahasa pengaturcaraan yang ditaip kuat, namun sokongannya untuk generik agak lemah. Oleh itu, menulis ujian unit untuk fungsi generik boleh memberikan beberapa cabaran. Artikel ini akan memperkenalkan anda kepada cara menulis ujian unit dengan berkesan untuk fungsi generik di Golang untuk memastikan kualiti dan kebolehpercayaan kod anda. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberikan anda petua dan kaedah praktikal untuk membantu anda menangani ujian unit fungsi generik dengan mudah. Mari lihat!

Kandungan soalan

Saya mempunyai fungsi generik mudah ini yang mengambil kunci daripada 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
}

Saya cuba menulis ujian unit dipacu jadual untuknya seperti ini:

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

Namun, kod berikut gagal

func (us *unitutilsuite) testunitgetmapkeys() {
    for i := range testunitgetmapkeys {
        us.t().run(testunitgetmapkeys[i].name, func(t *testing.t) {
            gotkeys := getmapkeys(testunitgetmapkeys[i].inputmap)
        })
    }
}

dan

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

Ini telah dibetulkan dengan penukaran eksplisit

gotKeys := getMapKeys(testUnitGetMapKeys[i].inputMap.(map[string]string))

Adakah terdapat cara untuk mengautomasikan ujian ini tanpa perlu melakukan penukaran eksplisit untuk setiap pembolehubah ujian input?

Penyelesaian

Sila ambil perhatian bahawa melainkan jika fungsi generik anda melaksanakan beberapa logik khusus jenis sebagai tambahan kepada logik generik, anda tidak akan mendapat apa-apa dengan menguji fungsi terhadap jenis yang berbeza. Logik umum fungsi adalah sama untuk semua jenis dalam set jenis parameter jenis, jadi ia boleh dilakukan sepenuhnya menggunakan satu jenis.

Tetapi jika anda ingin menjalankan ujian terhadap jenis yang berbeza, anda boleh lakukan:

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

Atas ialah kandungan terperinci Menulis ujian unit untuk fungsi generik dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam