Menguji os.Keluar Senario dalam Go dengan Maklumat Liputan (coveralls.io/Goveralls)
Soalan ini berkaitan dengan senario ujian yang melibatkan os. Exit() dalam Go, terutamanya cara menangkap maklumat liputan untuk senario ini. Kod sampel yang disediakan menunjukkan kaedah pelaksanaan semula, tetapi ia mengalami pengehadan dengan alat liputan dan kerapuhan.
Cabaran Liputan
Satu kesukaran ialah rangka kerja liputan seperti coveralls.io mungkin tidak merekodkan liputan ujian yang membangkitkan os.Exit(). Ini kerana instrumentasi liputan tidak digunakan apabila binari ujian dilaksanakan semula.
Kaedah Pelaksanaan Semula Diubahsuai
Untuk menangani isu ini, pengubahsuaian semula kaedah exec boleh digunakan. Kod asal difaktorkan semula untuk mengekstrak os.Exit sebagai pembolehubah bernama osExit. Kod ujian kemudian menggantikan osExit dengan fungsi olok-olok yang merekodkan kod keluar. Ini membolehkan maklumat liputan untuk panggilan osExit ditangkap.
Liputan Panggilan Luar
Teknik yang sama boleh digunakan untuk menutup panggilan ke fungsi seperti log.Fatalf() , yang secara tidak langsung memanggil os.Exit. Fungsi logFatalf digantikan dengan fungsi olok-olok yang merekodkan format mesej dan hujah yang dihantar kepadanya. Ini memastikan liputan senario di mana os.Exit dipanggil daripada fungsi luaran.
Contoh
Kod dan ujian yang diubah suai adalah seperti berikut:
// bar.go package foo import ( "fmt" "os" ) var osExit = os.Exit func Crasher() { fmt.Println("Going down in flames!") osExit(1) }
// bar_test.go package foo import ( "reflect" "testing" ) var logFatalf = log.Fatalf func TestCrasher(t *testing.T) { // Save original functions and restore at the end oldOsExit := osExit oldLogFatalf := logFatalf defer func() { osExit = oldOsExit logFatalf = oldLogFatalf }() // Mock osExit var got int myExit := func(code int) { got = code } osExit = myExit // Mock logFatalf var gotFormat string var gotV []interface{} myFatalf := func(format string, v ...interface{}) { gotFormat, gotV = format, v } logFatalf = myFatalf // Run test Crasher() // Check results exp := 1 if got != exp { t.Errorf("Expected exit code: %d, got: %d", exp, got) } expFormat, expV := "Exiting with code: %d", []interface{}{1} if gotFormat != expFormat || !reflect.DeepEqual(gotV, expV) { t.Error("Something went wrong") } }
Dengan mengasingkan fungsi berkaitan keluar dan menggunakan fungsi olok-olok, kedua-dua os.Exit dan luaran panggilan fungsi yang mencetuskan os.Keluar boleh diliputi dalam ujian Go. Pendekatan ini memastikan pelaporan liputan yang tepat untuk senario yang melibatkan penamatan proses.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Liputan Ujian Tepat untuk Kod Go Menggunakan `os.Exit()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!