Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mencapai Liputan Ujian 100% untuk Senario os.Exit() Go dengan Goveralls?
Menguji Go os.Exit Scenario dengan Maklumat Liputan (coveralls.io/Goveralls)
Keupayaan untuk menguji senario yang melibatkan os.Exit( ) adalah penting dalam pembangunan Go. Walau bagaimanapun, os.Exit() sukar untuk memintas secara langsung. Kaedah biasa melibatkan penggunaan semula binari dan menyemak status keluar.
Pendekatan ini menghadapi had, terutamanya kekurangan maklumat liputan dengan Goveralls dan potensi kerapuhan untuk menjalankan semula binari ujian.
Mencapai Liputan 100%
Untuk menangani cabaran ini, pertimbangkan pemfaktoran semula kod ujian:
package foo import ( "fmt" "io" "log" "os" "testing" ) var ( osExit = os.Exit logFatalf = log.Fatalf ) // Tester interface for mocking os.Exit() and log.Fatalf() type Tester interface { Fatal(string, ...interface{}) Exit(int) } type realTester struct{} func (r realTester) Fatal(s string, v ...interface{}) { log.Fatalf(s, v...) } func (r realTester) Exit(code int) { os.Exit(code) } func Crasher() { fmt.Print("Going down in flames!") logFatalf("Exiting with code: %d", 1) } // TestCrasher simulates os.Exit() and log.Fatalf() func TestCrasher(t *testing.T) { tests := []struct { name string f func(t *testing.T, original Tester, tester *mockTester) }{ {"Test os.Exit()", func(t *testing.T, orig, test *mockTester) { orig.Exit(1) if test.exitCode != 1 { t.Errorf("expected exit code 1, got %d", test.exitCode) } }}, {"Test log.Fatalf()", func(t *testing.T, orig, test *mockTester) { orig.Fatalf("Exiting after a test failure") if test.format != "Exiting after a test failure" { t.Errorf("expected format \"Exiting after a test failure\", got %s", test.format) } }}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { var orig Tester = realTester{} var mr mockTester test.f(t, orig, &mr) mr.Verify() }) } } // Mock tester simulates os.Exit() and log.Fatalf() type mockTester struct { format string values []interface{} exitCode int exitCalls int } func (m *mockTester) Fatal(s string, v ...interface{}) { m.format = s m.values = v m.exit() } func (m *mockTester) Exit(code int) { m.exitCode = code m.exit() } func (m *mockTester) exit() { m.exitCalls++ } // Verify checks that mockTester was called appropriately func (m *mockTester) Verify() { if m.exitCalls != 1 { panic("expected 1 call to Exit() or Fatal(), got %d", m.exitCalls) } }
Pendekatan ini memfaktorkan semula kod ujian ke dalam antara muka Penguji boleh guna semula, membenarkan untuk mengejek kedua-dua os.Exit() dan log.Fatalf(). Dengan memanggil Exit() atau Fatal() secara eksplisit dalam objek olok-olok dan mensimulasikan gelagat, anda boleh mencapai liputan 100% untuk senario ini.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Liputan Ujian 100% untuk Senario os.Exit() Go dengan Goveralls?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!