使用覆蓋資訊測試Go 中的os.Exit 場景(coveralls.io/Goveralls)
這個問題涉及涉及os.Exit 的測試場景。 Go 中的 Exit(),特別是如何捕捉這些場景的覆蓋資訊。提供的範例程式碼演示了重新執行方法,但它受到覆蓋工具和脆弱性的限制。
覆蓋挑戰
一個困難是覆蓋框架,例如coveralls.io 可能不會記錄引發 os.Exit() 的測試的覆蓋範圍。這是因為重新執行測試二進位檔案時,不會套用覆蓋率偵測。
修改的重新執行方法
為了解決此問題,修改了重新執行方法可以採用exec方法。原始程式碼被重構以將 os.Exit 提取為名為 osExit 的變數。然後,測試程式碼將 osExit 替換為記錄退出程式碼的模擬函數。這允許捕獲 osExit 調用的覆蓋資訊。
外部調用的覆蓋
可以應用相同的技術來覆蓋對 log.Fatalf() 等函數的調用,它間接調用 os.Exit。 logFatalf 函數被替換為模擬函數,該函數記錄訊息格式和傳遞給它的參數。這樣可以確保覆蓋外部函數呼叫 os.Exit 的場景。
範例
修改後的程式碼和測試如下:
// 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") } }
透過隔離與退出相關的功能並使用模擬函數,os.Exit 和觸發的外部函數呼叫os.Exit 可以在Go 測試中覆寫。這種方法確保了涉及進程終止的場景的準確覆蓋率報告。
以上是如何使用 os.Exit() 實現 Go 程式碼的準確測試覆蓋率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!