Go最佳实践1——单元测试的另一种写法

原文链接:【Go最佳实践1】单元测试的另一种写法

引言

go中单元测试有3种类型:

  • unit test:单元测试
  • benchmark:基准测试
  • example:例子

第一种、第二种比较常见,在各种书籍都有介绍,主要是 第3种 应用在什么场合?让我们一起看看。

写法一:unit test

最基本的单测,文件名需要以 xxx_test.go 结尾,比如 logger_test.go

新建单元测试函数时,只要输入 Test IDE就会进行自动补全:

func Test

当我们选择一个合适的名字后回车,填充测试逻辑后,直接在 Goland 点击函数左侧的小三角,就可以启动单测。

如下是一个完整实例:

func Test_NewStdLogger(t *testing.T) {
   l := NewStdLogger(log.Writer())

   l.Debug("111", "")
   l.Debugf("%s,%d,%.2f", "shuo", 2022, float32(10)/3)
   l.Info("info")
   l.Warn("warn")
}

执行后输出:

=== RUN   TestNewStdLogger
[DEBUG] 111
[DEBUG] shuo,2022,3.33
[INFO] info
[WARN] warn
--- PASS: TestNewStdLogger (0.00s)
PASS

写法二:benchmark

基准测试需要以 Benchmark 开头,如:

func BenchmarkI18NHelper_Localize(b *testing.B) {
}

因为不是本章的重点,所以只简单说明一下。

写法三:example test

PS:了解即可

在浏览 go-kit 开源项目的log实现时(example_test.go),发现了还有另外一种example的写法。

这种做法的好处是,相比Test开头的单元测试,它不需要运行就能知道结果并且实际输出要和代码中的注释一致才会通过

所以,我认为它特别适合 pkg公共库 的场景,别人只需要在github看你的源文件,就能知道你的输出,从而决定是否符采用你的代码或者pkg。

如下是摘取 go-kit 中的部分代码:

func Example_basic() {
   logger := NewStdLogger(os.Stdout)
   type Task struct {
      ID int
   }
   RunTask := func(task Task, logger Logger) {
      logger.Debug("taskID=", task.ID, " event=", "starting task")
      logger.Info("taskID=", task.ID, " event=", "task complete")
      logger.Warnf("taskID=%d event=%s", task.ID, "task delete")
   }
   RunTask(Task{ID: 1}, logger)

   // Output:
   // [DEBUG] taskID=1 event=starting task
   // [INFO] taskID=1 event=task complete
   // [WARN] taskID=1 event=task delete
}

这种单测需要以 Example 打头并且不需要任何参数。

文件末尾通过 注释 (关键字必须是 Output)来声明期望的输出,如果执行注释和实际输出不一致,单测失败。

上面的代码执行后输出:

=== RUN   Example_basic
--- PASS: Example_basic (0.00s)
PASS

改动注释(删除taskID=1中的=号):

- [DEBUG] taskID1 event=starting task
+ [DEBUG] taskID=1 event=starting task

此时运行单测报错:

=== RUN   Example_basic
--- FAIL: Example_basic (0.00s)
got:
[DEBUG] taskID1 event=starting task
[INFO] taskID=1 event=task complete
[WARN] taskID=1 event=task delete
want:
[DEBUG] taskID=1 event=starting task
[INFO] taskID=1 event=task complete
[WARN] taskID=1 event=task delete

FAIL

总结

本文介绍了3种单元测试类型:

  • 功能测试:以Test打头
  • 示例代码测试:Example打头,且要声明// Output
  • 性能测试:Benchmark打头

延伸阅读:Go语言基础:Test的基础知识

关于作者

如果觉得文章写得还不错,欢迎关注公众号:《Go和分布式IM》

  • 回复 “TeamTalk” 、 “源码” 获取蘑菇街内部未删减IM源码一份;
  • 回复 “PDF” 免费领取1000本经典PDF书籍;
  • 回复 “赚钱” 看看别人都有一些什么套路;
  • 回复 “算法” 免费获取价值¥9888的算法训练营第四期视频一份;
  • 回复 “Go进阶“ 获取价值¥6888的Go进阶训练营视频一份;
  • 回复 “Go面试“ 获取Go语言面试题100道;
  • 回复 “Docker“ 获取官方入门教程最新中文翻译版PDF;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值