log.Fatal() を含む Go 関数のテスト
log.Fatal() を利用して出力する Go 関数があるシナリオを考えてみましょう。メッセージ。このような関数のテストは、log.Fatal() が os.Exit(1) をトリガーしてテスト失敗を引き起こすため、困難な場合があります。
アプローチ:
この課題を克服するには、出力を標準の log.xxx() 宛先にリダイレクトするカスタム ロガーを実装することをお勧めします。ただし、テスト中に、log.Fatalf() などの関数を、os.Exit(1) を呼び出さない独自の実装と簡単に交換できます。
例:
ログを出力する次のコードがあるとします。
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" ) func TestHello(t *testing.T) { var buf bytes.Buffer log.SetOutput(&buf) hello() wantMsg := "Hello!\n" msg := buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } } func TestGoodby(t *testing.T) { var buf bytes.Buffer log.SetOutput(&buf) goodbye() wantMsg := "Goodbye!\n" msg := buf.String() if msg != wantMsg { t.Errorf("%#v, wanted %#v", msg, wantMsg) } }
注:
このアプローチにより、テスト中に特定のロガー関数を柔軟に置き換えることができ、ロガーの機能に影響を与えることなく動作をカスタマイズできます。オリジナル機能はテスト中です。
以上が「log.Fatal()」を使用して Go 関数を効果的にテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。