在Go 中使用覆蓋資訊測試os.Exit 場景
在Go 中測試調用os.Exit() 的場景可能具有挑戰性,因為直接攔截os.Exit() 是不可行的。常見的方法是重新呼叫二進位檔案並檢查其退出值。然而,這種方法有局限性,包括:
應對挑戰
為了應對這些挑戰,對這些挑戰,應對挑戰
為了應對這些挑戰,應對的重構可以確保100% 覆蓋率:
package foo import ( "fmt" "os" ) // Expose os.Exit as a variable for unit testing var osExit = os.Exit func Crasher() { fmt.Println("Going down in flames!") osExit(1) }
package foo import ( "testing" "reflect" ) func TestCrasher(t *testing.T) { // Save and restore the original os.Exit() function oldOsExit := osExit defer func() { osExit = oldOsExit }() // Define a mock exit function that captures the exit code var got int myExit := func(code int) { got = code } // Set the mock exit function as os.Exit() osExit = myExit Crasher() // Call the function being tested // Assert that the expected exit code was returned if exp := 1; got != exp { t.Errorf("Expected exit code: %d, got: %d", exp, got) } }
作者執行 go test -cover,覆蓋率報告現在將準確反映 Crasher() 的執行及其退出條件。
擴展到其他函數var logFatalf = log.Fatalf func Crasher() { fmt.Println("Going down in flames!") logFatalf("Exiting with code: %d", 1) }foo/bar.go:
func TestCrasher(t *testing.T) { // Save and restore the original log.Fatalf() function oldLogFatalf := logFatalf defer func() { logFatalf = oldLogFatalf }() // Define a mock fatalf function that captures the arguments var gotFormat string var gotV []interface{} myFatalf := func(format string, v ...interface{}) { gotFormat, gotV = format, v } // Set the mock fatalf function as log.Fatalf() logFatalf = myFatalf Crasher() // Call the function being tested // Assert that the expected format string and arguments were used expFormat, expV := "Exiting with code: %d", []interface{}{1} if gotFormat != expFormat || !reflect.DeepEqual(gotV, expV) { t.Error("Something went wrong") } }foo/bar_test.go:
透過此方法,您可以全面測試 Go 中的 os.Exit 場景,並從您的測試框架中獲得準確的覆蓋率資訊。
以上是在 Go 中使用 os.Exit() 時如何達到 100% 的測試覆蓋率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!