在包目录内,所有以_test.go为后缀名编写的go文件不会参与go build的编译过程.
本文所有的代码均放置在带缓冲区的异步写日志库[1]。
go test 一共三种测试函数:
- • 标准测试函数, 函数以Test为前缀,用于测试逻辑行为正确性, go test 会报告测试结果 PASS、FAIL
- • 基准测试函数是以Benchmark为前缀的函数,用于衡量函数性能, 拿到平均执行时间
- • 示例函数, 提供一个编译器保证正确性的示例文档
1. 标准测试函数
- • 导入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")
}
}
2. 基准测试函数
- • 以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=. 执行基准测试
代码语言:javascript复制以上如果有单元测试,也会执行,若要忽略单元测试,请执行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 倍。
3. 示例测试函数
- • 以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
}
btw 本文测试源码位于https://github.com/zwbdzb/logrus-bufferedWriter-hook, 这是一个带异步缓冲区的logrus日志Hook,能有效解决logrus默认不支持异步日志带来的写性能问题,欢迎试用,期待你的star。
引用链接
[1]
带缓冲区的异步写日志库: https://github.com/zwbdzb/logrus-bufferedWriter-hook
自古以来,同步/异步都是八股文第一章
自古以来,反射也是兵家必争之地
Go编程快闪之logrus日志库
流量调度、微服务可寻址性和注册中心
摸鱼快报:golang net/http中的雕虫小技
Go语言正/反向代理的姿势
两将军问题和TCP三次握手