阅读 599

手摸手教你编写 Golang 单元测试

这是我参与更文挑战的第9天,活动详情查看:更文挑战

如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多文章在我博客

手摸手教你写 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
复制代码
文章分类
后端
文章标签