go內置了一套單元測試機制: 利用 go test測試命令
和一套按照約定發方式編寫的測試函數。
在包目錄內,所有以_test.go爲後綴名編寫的go文件不會參與go build的編譯過程.
本文所有的代碼均放置了帶緩衝區的異步寫日誌庫。
go test 一共三種測試函數:
- 標準測試函數, 函數以Test爲前綴,用於測試邏輯行爲正確性, go test 會報告測試結果 PASS、FAIL
- 基準測試函數是以Benchmark爲前綴的函數,用於衡量函數性能, 拿到平均執行時間
- 樣例函數, 提供一個編譯器保證正確性的示例文檔
標準測試函數
- 導入testing包
- 以Test開頭,除Test開頭的自定義函數需要首字母大寫
- 函數參數t *testing.T用於報告測試失敗和附加的日誌信息
func TestWriteLog(t *testing.T) {
l := logrus.New()
l.SetFormatter(&logrus.TextFormatter{
DisableTimestamp: true,
})
l.SetOutput(io.Discard) // Send all logs to nowhere by default
bh := &BufferedWriterHook{Writer: os.Stdout}
defer bh.Stop()
err := bh.Fire(&logrus.Entry{Logger: l, Level: logrus.InfoLevel, Message: "test" + time.Now().Format(time.RFC3339)})
if err != nil {
t.Error(t.Name() + " FAIL")
}
}
基準測試函數
- 以Benchmark開頭
- b.N表示迭代次數,不固定,確保至少執行1s
func BenchmarkFire(b *testing.B) {
l := logrus.New()
l.SetFormatter(&logrus.TextFormatter{
DisableTimestamp: true,
})
logf, err := os.OpenFile("./log.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600)
if err != nil {
panic(err)
}
defer logf.Close()
bh := &BufferedWriterHook{Writer: logf}
defer bh.Stop()
b.ResetTimer() // 重置計時器,忽略前面的準備時間
for n := 0; n < b.N; n++ {
err := bh.Fire(&logrus.Entry{Logger: l, Level: logrus.InfoLevel, Message: "test" + time.Now().Format(time.RFC3339)})
if err != nil {
b.Error(b.Name() + " FAIL")
}
}
}
go test -bench=. 執行基準測試
以上如果有單元測試,也會執行,若要忽略單元測試,請執行go test -bench=. -count 5 -run=^#
//對https://github.com/zwbdzb/logrus-bufferedWriter-hook執行基準測試
BenchmarkFire-8 940003 1130 ns/op
BenchmarkFire1-8 53912 19678 ns/op
前者是循環次數,後者是每次循環的平均耗時。
結果顯示 帶異步緩衝區的logrus寫磁盤能力,是logrus默認同步寫磁盤能力的10+倍。
樣例函數
- 以Example開頭
- 需要在代碼內體現 預期輸出
go test -run=ExampleHook_default
func ExampleHook_default() {
l := logrus.New()
l.SetLevel(logrus.InfoLevel)
l.SetFormatter(&logrus.TextFormatter{
DisableTimestamp: true,
})
l.SetOutput(io.Discard) // Send all logs to nowhere by default
ws := &BufferedWriterHook{Writer: os.Stdout}
defer ws.Stop()
l.AddHook(ws)
l.Info("test2")
l.Warn("test3")
l.Error("test4")
// Output:
// level=info msg=test2
// level=warning msg=test3
// level=error msg=test4
}
本文快速記錄了golang單元測試、基準測試、樣例測試的寫法,耗時3h, 有用指數4顆星。
如果你對這個帶緩衝區的異步寫logrus擴展庫https://github.com/zwbdzb/logrus-bufferedWriter-hook 感興趣,歡迎試用 ,期待你的star.