Go テストでのログ出力のテスト
Go では、単体テストには、テストされた関数によって生成された出力またはログの検証が含まれることがよくあります。特定のシナリオでエラーを記録する関数があるとします。
問題:
エラー メッセージを記録する次の関数 readByte があるとします。
func readByte(/*...*/) { // ... if err != nil { fmt.Println("ERROR") log.Print("Couldn't read first byte") return } // ... }
関数を変更せずに go test を使用して readByte の出力エラーをテストするにはどうすればよいですか
解決策:
ログ出力をキャプチャするには、テスト中にログ パッケージの出力を一時バッファにリダイレクトし、内容をアサートします。バッファの
コード例:
readbyte_test.go ファイル:
package main import ( "bytes" "fmt" "io" "log" "os" "testing" ) func readByte( /*...*/ ) { // ... err := io.EOF // Force an error if err != nil { fmt.Println("ERROR") log.Print("Couldn't read first byte") return } // ... } func TestReadByte(t *testing.T) { var buf bytes.Buffer log.SetOutput(&buf) defer func() { log.SetOutput(os.Stderr) }() readByte() t.Logf("Output: %s", buf.String()) }
出力例:
$ go test -v readbyte_test.go === RUN TestReadByte --- PASS: TestReadByte (0.00s) readbyte_test.go:30: Output: ERROR Couldn't read first byte PASS ok command-line-arguments 0.004s $
この例では、Go の組み込みメソッドを使用して、出力されたエラー メッセージをテストおよび検証できます。元の readByte 関数を変更することなく、テスト ツールで使用できます。
以上が関数を変更せずに Go テストでログ出力をテストする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。