Rumah >pembangunan bahagian belakang >Golang >Menulis ujian unit untuk fungsi generik dalam 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!
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?
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!