log.Fatal() を使用した Go 関数のテスト
Go アプリケーションでは、重大なエラーを記録するために log.Fatal() を使用するのが一般的です。そしてすぐにプログラムを終了します。この動作は実稼働環境では便利ですが、テスト時には課題が生じます。この課題を克服する方法は次のとおりです。
テスト用のカスタム ロガー
1 つのアプローチは、ログ メッセージを事前定義されたバッファにリダイレクトするカスタム ロガーを実装することです。これにより、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 中国語 Web サイトの他の関連記事を参照してください。