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

Menulis ujian unit untuk fungsi generik dalam golang

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2024-02-11 09:42:09
ke hadapan
1234 orang telah melayarinya

在 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
}
Salin selepas log masuk

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},
    },
}
Salin selepas log masuk

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)
        })
    }
}
Salin selepas log masuk

dan

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

Ini telah dibetulkan dengan penukaran eksplisit

gotKeys := getMapKeys(testUnitGetMapKeys[i].inputMap.(map[string]string))
Salin selepas log masuk

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)
            }
        })
    }
}
Salin selepas log masuk

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 Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan