2016-12-20 5 views
1

私はプログラムでログのエミッタを識別するログメッセージにプレフィックスを追加できるようにタイプラッピンググログを実装しました。エミッタごとのログレベルを変更できます。Goロギングパッケージを使用してコードをテストする方法glog?

ユニットテストはどのように実装できますか?問題はglogがテキストをstdErrに出力することです。

コードは簡単ですが、残りのコードと同様に単体テストと100%カバレッジが必要です。このプログラミングの努力はすでに支払われています。

+0

glog出力(:

package main import ( "bytes" "io" "os" "testing" "github.com/golang/glog" "strings" ) func captureStderr(f func()) (string, error) { old := os.Stderr // keep backup of the real stderr r, w, err := os.Pipe() if err != nil { return "", err } os.Stderr = w outC := make(chan string) // copy the output in a separate goroutine so printing can't block indefinitely go func() { var buf bytes.Buffer io.Copy(&buf, r) outC <- buf.String() }() // calling function which stderr we are going to capture: f() // back to normal state w.Close() os.Stderr = old // restoring the real stderr return <-outC, nil } func TestGlogError(t *testing.T) { stdErr, err := captureStderr(func() { glog.Error("Test error") }) if err != nil { t.Errorf("should not be error, instead: %+v", err) } if !strings.HasSuffix(strings.TrimSpace(stdErr), "Test error") { t.Errorf("stderr should end by 'Test error' but it doesn't: %s", stdErr) } } 

がテストを実行しています/godoc.org/github.com/golang/glog))は設定可能です。 stderrではなくファイルに出力できますか? – JimB

+1

stdoutのようなテストでstderrをキャプチャするには、この[answer](http://stackoverflow.com/a/10476304/1024794) –

+0

@JimBで動作するようにしてください。しかし、ラッパーメソッドの呼び出しごとに何が出力されたのかをテストすることは難しいでしょう。 – chmike

答えて

2

テスト:あなたは[ `github.com/golang/glog`](https:/を参照している場合

go test -v 
=== RUN TestGlogError 
--- PASS: TestGlogError (0.00s) 
PASS 
ok  command-line-arguments 0.007s 
0

あなたの使い方を説明するインターフェイスを作成します。 Vメソッドを使用するとこれはあまり意味がありませんが、ラッパーを使用しているため、これを修正する作業が既に完了しています。あなたは、テスト

type Logger interface { 
    Infoln(...interface{}) // the methods you actually use in this package 
} 

を定義し、簡単にあなたのコード内で直接glog型を参照しないことによって、それを交換することができます。する必要がある各パッケージの

標準エラー出力をキャプチャし

+1

私はすでにそれをしました。これにより、ラッパーの使用をテストできます。完璧な提案。問題は、ラッパー自体をテストする方法です。 – chmike

関連する問題