不会写单元测试的程序员不是一个滴滴司机

发表于:2023-7-07 09:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:掘金码甲哥    来源:稀土掘金

  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扩展库github.com/zwbdzb/logr… 感兴趣,可以试用 ,期待你的star。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号