Golang test模块使用

  • Code, Golang
  • 17 clicked

go test命令是一个按照一定的约定和组织来测试代码的程序。在包目录内,所有以_test.go为后缀名的源文件在执行go build时不会被构建成包的一部分,它们是go test测试的一部分。

在*_test.go文件中,有三种类型的函数:功能测试函数、基准性能测试(benchmark)函数、示例函数

1. test文件和函数命名

  • 文件必须是*_test.go
  • 功能测试函数名必须以Test开头,函数参数必须是*testing.T
  • 性能测试函数名必须以Benchmark开头,函数参数必须是*testing.B
  • 示例测试函数名必须以Example开头,函数参数无要求

go test命令会遍历所有的*_test.go文件中符合上述命名规则的函数,生成一个临时的main包用于调用相应的测试函数,接着构建并运行、报告测试结果,最后清理测试中生成的临时文件。

2. 编写测试文件

  • 每个测试函数必须导入testing包。测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头:

  • 测试函数有如下的签名:

  • 其中t参数用于报告测试失败和附加的日志信息。让我们定义一个实例包gopl.io/ch11/word1,其中只有一个函数IsPalindrome用于检查一个字符串是否从前向后和从后向前读都是一样的。(下面这个实现对于一个字符串是否是回文字符串前后重复测试了两次;我们稍后会再讨论这个问题。)

  • 在相同的目录下,word_test.go测试文件中包含了TestPalindrome和TestNonPalindrome两个测试函数。每一个都是测试IsPalindrome是否给出正确的结果,并使用t.Error报告失败信息;

3. 测试过程

  • 对于功能测试,go test会并发执行,默认最大是8个并发,可以通过-parallel指定,最终按测试函数在文件中的顺序打印测试结果

  • 对于性能测试,go test会顺序执行,最终按测试函数在文件中的顺序打印测试结果

4. Cache

go test有两种执行模式:local mode and package list mode

  • local mode:即直接cd到特定目录中运行go test,不指定目录

  • package list mode:在任意目录中运行go test,指定要测试的package目录

在local mode中,无cache功能,但在package list mode中,测试成功的测试会被cache,如果后续没有改过测试函数,也没有改过被测函数,那么将直接使用cache的结果加速整个测试

5. Log

为了避免两次输入较长的字符串,我们使用了提供了有类似Printf格式化功能的 Errorf函数来汇报错误结果。

当添加了这两个测试用例之后,go test返回了测试失败的信息

  • t.Error/Errorf 测试失败,输出err log

  • t.Fatal/Fatalf 测试失败,输出err log,立即退出后续测试

测试过程中如果需要显示fmt/t.Log的输出需要指定-v参数

6. 性能测试

  1. 性能测试中循环调用的次数是用b.N控制的,测试每个函数时如果运行时间没有超过1s,那么就会调大b.N重新测试,直到达到1s,结果展示的就是此时的b.N值和平均每次耗时
  2. 性能测试可以使用b.StopTimer/b.StartTimer/b.RestTimer排除一些干扰代码
  3. 重点关注每次操作的耗时和内存分配次数

参考文档:
go test: 要点:https://zhuanlan.zhihu.com/p/80567543
go test: http://shouce.jb51.net/gopl-zh/ch11/ch11-01.html
Go Test 单元测试简明教程: https://geektutu.com/post/quick-go-test.html

赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注