我已經實現了一個打包日誌,這樣我就可以在日誌消息中添加一個前綴來標識我的程序中的日誌發送器,並且我可以更改每個發射器的日誌級別。如何使用Go日誌包glog測試代碼?
我該如何實現單元測試?問題在於glog將文本輸出到stdErr。
該代碼是微不足道的,但我希望有單元測試和100%覆蓋像其餘的代碼。這種編程工作已經付出。
我已經實現了一個打包日誌,這樣我就可以在日誌消息中添加一個前綴來標識我的程序中的日誌發送器,並且我可以更改每個發射器的日誌級別。如何使用Go日誌包glog測試代碼?
我該如何實現單元測試?問題在於glog將文本輸出到stdErr。
該代碼是微不足道的,但我希望有單元測試和100%覆蓋像其餘的代碼。這種編程工作已經付出。
測試捕獲標準錯誤:
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)
}
}
運行測試:
go test -v
=== RUN TestGlogError
--- PASS: TestGlogError (0.00s)
PASS
ok command-line-arguments 0.007s
編寫描述您使用情況的界面。如果你使用V
方法,這將不會很漂亮,但你有一個包裝,所以你已經完成了修復所需的辛勤工作。
對於每一個你需要測試包,定義
type Logger interface {
Infoln(...interface{}) // the methods you actually use in this package
}
然後你就可以輕鬆地不是指直接在你的代碼出入記錄類型掉出來。
我已經做到了。這將允許測試我的包裝的使用。完美的建議。問題是如何測試包裝本身。 – chmike
的出入記錄輸出(如果你指的是['github.com/golang/glog'](https:/ /godoc.org/github.com/golang/glog))是可配置的。你可以輸出到文件而不是標準錯誤嗎? – JimB
你可以捕獲stderr在測試像標準輸出被捕獲在這[答案](http://stackoverflow.com/a/10476304/1024794) –
@JimB將工作。但是,但是很難測試每次調用我的包裝方法時輸出的內容。 – chmike