如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。[更多文章在我博客] coderdao.github.io
手摸手教你写 Golang 单元测试
不说废话, 先码为敬
表达从简单开始, 那么我们先举个例子:
预设需要 业务文件(被测试
的脚本)
编写与之对应的 测试脚本
接着进入 需要测试的 package 包目录路径
, 运行 go test
命令
$ go test -v
=== RUN TestMult
--- PASS: TestMult (0.00s)
PASS
ok demo 0.006s
将启动当前路径下的所有测试用例
(文件名以 _test.go 结尾); 添加 -v
参数可以查看测试用例详细运行信息
。
以上就是一个简约但完整的 单元(功能)测试用例
。
golang 测试命令
测试命令格式: go test [build/test flags] [packages] [build/test flags & test binary flags]
go test
命令会自动匹配指定路径
下(默认为:当前路径)文件命名为 *_test.go
的包测试文件
, 将被编译为单独的包,与主测试二进制文件
链接并运行;
如何设置忽略文件夹、文件
名称以_
(包括_test.go
)或.
开头的文件将会被忽略。
go 工具将忽略名为testdata
的目录,使其可用保存测试所需的辅助数据。
Go 两种不同测试模式
本地目录模式
本地目录模式
发生在 go test 时,不带包参数调用(例如,‘go test’ 或 ‘go test -v’)。
在这种模式下, go test 编译包源并在当前目录中找到测试,然后运行结果测试二进制。
在这种模式下,缓存(下面讨论)被禁用。包测试完成后, go test 打印一个摘要行显示测试状态(‘ok’ 或 ‘FAIL’)、包名称和已用时间时间。
包列表模式
包列表模式
发生在在调用 go test 时带有显式包参数(例如“go test math”、“go test ./…”,甚至“go test .”)。在这种模式下, go test 编译并测试命令行上列出的每个包。
- 如果一个包测试通过,go test 只打印最终的“ok”摘要线。
- 如果包测试失败, go test 会打印完整的测试输出。
- 如果使用 -bench 或 -v 标志调用,则 go test 打印完整的输出甚至通过包测试,以显示请求的基准测试结果或详细日志记录。
包测试缓存
仅在包列表模式下,go test 缓存成功的包测试, 避免不必要的重复运行测试。
测试的结果可以从缓存中恢复,go test 会重新显示之前的输出而不是运行测试二进制文件
再次。发生这种情况时, go test 打印 ‘(cached)’ 代替摘要行中的已用时间。当运行命令有添加参数:-cpu
、-list
、-parallel
、-run
、-short
、-v
测试结果将会被缓存。显式禁用测试缓存的常用方法是使用-count=1
。
为什么需要测试
Golang
自带 testing
测试包,调用它就能自动完成单元测试
、性能测试
、验证结果
。
而项目开发过程中完整的单元测试
, 能够在 功能上线
、新环境部署
等常见业务场景, 大大提高发现、重现、定位问题
的效率。尤其是在大且复杂
的项目中更是 减少线上故障、异常出现
的有效手段。
测试文件编写要点
- 测试用例文件使用go test命令来执行,源码中不需要 main() 函数作为入口,所有以_test.go结尾的源码文件内以Test开头的函数都会自动执行。
测试类型、测试文件编写要点
Golang testing 包提供了 3 种测试: 单元(功能)测试
、性能(压力)测试
、覆盖率测试
。
共同的编写要点有:
- 测试文件名必须以
_test.go
结尾 - 测试文件需要导入 testing 包
import "testing"
- 测试文件可以由
多个测试用例(函数)组成
- 测试文件
不会参与
正常源码编译,不会被包含在可执行文件内
单元(功能)测试 go test -v
单元测试以
Test
开头,(t *testing.T)作为参数
,后面第一个字母必须大写
(例如 TestAbc())
性能(压力)测试 go test -bench="."
性能测试以
Benchmark
开头,(t *testing.B)做为参数
,后面第一个字母必须大写
(例如 TestAbc())
覆盖率测试 go test -cover
覆盖率测试
可以获知 测试程序 共覆盖
多少业务代码(也就是 demo_test.go 中测试了多少 demo.go 中的代码),最好是覆盖100%
。
$ go test -cover
PASS
coverage: 100.0% of statements
ok demo 0.006s