log.Fatal() を利用する Go 関数を作成する場合、その即時終了によりテストが困難になる可能性があります。プログラムの。これを克服するには、テストの実行を停止することなく、目的のロギング動作をテストできるソリューションが必要です。
1 つのアプローチは、デフォルトの log.Fatal() 関数をオーバーライドするカスタム ロガーを作成することです。プログラムを終了せずにログ メッセージを記録します。このカスタム ロガーをテスト コンテキスト内で使用すると、予期されるログ メッセージを検証できるようになります。
たとえば、「Hello!」をログに記録する関数があるとします。メッセージと、「さようなら!」というメッセージを記録するメッセージです。 log.Fatal() を使用したメッセージ。
package main import ( "log" ) func hello() { log.Print("Hello!") } func goodbye() { log.Fatal("Goodbye!") } func init() { log.SetFlags(0) } func main() { hello() goodbye() }
これらの関数をテストするには、カスタム バッファ ロガーを作成できます。
package main import ( "bytes" "log" "testing" ) type BufferLogger struct { buf bytes.Buffer } func (l *BufferLogger) Println(v ...interface{}) { l.buf.WriteString(fmt.Sprintln(v...)) } func TestHello(t *testing.T) { l := &BufferLogger{} log.SetOutput(l) hello() wantMsg := "Hello!\n" msg := l.buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } }
このカスタム BufferLogger では、すべてのログ出力を次のようにリダイレクトします。デフォルトのコンソールの代わりにバッファーを使用します。これにより、ログ メッセージをキャプチャし、テスト内の期待値と比較することができます。
goodby() 関数の場合、カスタム ロガーの Fatal() 関数をオーバーライドすることで、同様のテストを作成できます。プログラムの終了を防ぎます:
func (l *BufferLogger) Fatalf(format string, v ...interface{}) { l.buf.WriteString(fmt.Sprintf(format, v...)) } func TestGoodbye(t *testing.T) { l := &BufferLogger{} log.SetOutput(l) goodbye() wantMsg := "Goodbye!\n" msg := l.buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } }
log.Fatal() 関数をオーバーライドすることで、予想されるログ メッセージをキャプチャしながらテストの実行を続行できます。この手法により、プログラムが早期に終了することなく、log.Fatal() を利用する関数を包括的にテストできます。
以上がlog.Fatal() を使用して Go 関数を効果的にテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。