原文链接:【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;