手摸手教你写 Golang 单元测试

不说废话, 先码为敬

表达从简单开始, 那么我们先举个例子:

被测试


测试脚本


需要测试的 package 包目录路径go test
所有测试用例-v运行信息
单元(功能)测试用例

golang 测试命令

测试命令格式: go test [build/test flags] [packages] [build/test flags & test binary flags]

go test指定路径*_test.go包测试文件主测试二进制文件

如何设置忽略文件夹、文件

__test.go.testdata

Go 两种不同测试模式

本地目录模式

本地目录模式

在这种模式下, go test 编译包源并在当前目录中找到测试,然后运行结果测试二进制。
在这种模式下,缓存(下面讨论)被禁用。包测试完成后, go test 打印一个摘要行显示测试状态(‘ok’ 或 ‘FAIL’)、包名称和已用时间时间。

包列表模式

包列表模式


  • 如果一个包测试通过,go test 只打印最终的“ok”摘要线。
  • 如果包测试失败, go test 会打印完整的测试输出。
  • 如果使用 -bench 或 -v 标志调用,则 go test 打印完整的输出甚至通过包测试,以显示请求的基准测试结果或详细日志记录。


包测试缓存

仅在包列表模式下,go test 缓存成功的包测试, 避免不必要的重复运行测试。
测试的结果可以从缓存中恢复,go test 会重新显示之前的输出而不是运行测试二进制文件

-cpu-list-parallel-run-short-v-count=1

为什么需要测试

Golangtesting单元测试性能测试验证结果完整的单元测试功能上线新环境部署发现、重现、定位问题大且复杂减少线上故障、异常出现

测试文件编写要点


  • 测试用例文件使用go test命令来执行,源码中不需要 main() 函数作为入口,所有以_test.go结尾的源码文件内以Test开头的函数都会自动执行。


测试类型、测试文件编写要点

单元(功能)测试性能(压力)测试覆盖率测试

共同的编写要点有:


_test.goimport "testing"多个测试用例(函数)组成不会参与


go test -v
Test(t *testing.T)作为参数第一个字母必须大写



go test -bench="."
Benchmark(t *testing.B)做为参数第一个字母必须大写



go test -cover
覆盖率测试共覆盖100%

$ go test -cover PASS coverage: 100.0% of statements ok demo 0.006s