51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 591|回复: 0
打印 上一主题 下一主题

[资料] 单元测试对一个程序员来说是不是也一样重要

[复制链接]
  • TA的每日心情
    无聊
    12 小时前
  • 签到天数: 944 天

    连续签到: 3 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-7-7 11:26:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    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。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-8 21:55 , Processed in 0.059904 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表