使用log.Fatal() 測試Go 函數
Go 應用程式中常見使用log.Fatal() 來記錄嚴重錯誤然後立即終止程序。雖然此行為在生產環境中很有用,但在測試時卻帶來了挑戰。以下是克服這項挑戰的方法:
用於測試的自訂記錄器
一種方法是實作自訂記錄器,將日誌訊息重新導向到預先定義的緩衝區。這允許您測試日誌記錄功能,而無需程式因 log.Fatal() 而終止。
// logger.go contains a testing logger that implements *log.Logger type TestingLogger struct { b bytes.Buffer } // Println implements log.Print methods, writing to a buffer instead of stdout. func (l *TestingLogger) Println(args ...interface{}) { l.b.WriteString(fmt.Sprintln(args...)) } // String returns the buffered log messages. func (l *TestingLogger) String() string { return l.b.String() }
測試範例
使用自訂記錄器,您可以繼續測試日誌記錄功能,如下所示:
package main import ( "bytes" "log" "testing" ) // Set up the custom logger for testing. var logger = &logger.TestingLogger{} func init() { log.SetOutput(logger) } func TestGoodbye(t *testing.T) { // Call the function to be tested. log.Fatal("Goodbye!") // Verify the expected log message was written to the buffer. wantMsg := "Goodbye!\n" if logger.String() != wantMsg { t.Errorf("Expected: %s, Got: %s", wantMsg, logger.String()) } }
透過將日誌記錄功能與程式終止分離並擷取日誌訊息緩衝區,您可以有效地測試任何使用log.Fatal()的程式碼,而不會導致測試失敗。
以上是如何有效測試使用 log.Fatal() 的 Go 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!