Go语言学习19-样本测试

引言

上一篇笔者介绍了 Go 语言的 基准测试,其实在测试源码文件中还可以添加样本测试函数,但编写样本测试函数不需要使用 testing 代码包的 API

下面我们来介绍一下 Go 语言的样本测试:

主要内容

1. 编写样本测试函数

样本测试函数的名称需要以 Example 作为开始。在这类函数的函数体的最后还可以有若干个注释行。它们作用是比较在该测试函数被执行期间,标准输出上出现的内容是否与预期的相符。但要想这些注释航被正确地解析,需满足下面几个条件:

  • 这些注释行必须出现在函数体的末尾,且在它们和作为当前函数体结束符的“}”之间没有任何代码。否则,注释行对于样本测试来说是无效的。

  • 在第一行注释中,紧跟在单行注释前导符//之后的永远应该是Output:,否则这些注释行对于样本测试来说是无效的。

  • Output: 右边的内容以及后续注释行中的内容都分别代表了标准输出中的一行内容。

如下一个测试源码文件 et_test.go,位于工作区 src 下的 testing/et 代码包中:

1
2
3
4
5
6
7
8
9
10
package et

import (
"fmt"
)

func ExampleHello() {
fmt.Println("Hello, Huazie")
// Output: Hello, Huazie
}

2. 样本测试的运行

使用 go test 命令对上面的源码文件 et_test.go 进行测试,运行截图如下:

调用 fmt.Println 函数所产生的打印内容并不会真正地出现在标准输出上,而只会被用于与样本注释行中的内容做对比。现在修改 fmt.Println 中内容为 Hello, Huazie1,运行结果截图如下:

现在将样本测试函数 ExampleHello 修改成这样:

1
2
3
4
5
6
7
8
9
func ExampleHello() {
for i := 0; i < 3; i++ {
fmt.Println("Hello, Huazie")
}

// Output: Hello, Huazie
// Hello, Huazie
// Hello, Huazie
}

运行截图如下:

测试仍然通过,不过需要注意,在样本测试函数的函数体末尾的多个样本注释行必须是连续的,在它们之间不能间隔任何行,即使是空行也不行。命令程序只会把在样本测试函数的函数体中的紧挨着当前函数体结束符 } 的注释行视为样本注释行。如果一个样本测试函数中没有任何样本注释行,那么这个函数仅仅会被编译而不会执行。

3. 样本测试函数的命名

样本测试函数命名规则:

  • 当被测试对象是整个代码包时,样本测试函数的名称应该是Example,即直接以样本测试函数名的统一前缀作为函数名称。

  • 当被测试对象是一个函数时,对于函数F,样本测试函数的名称应该是 ExampleF

  • 当被测试对象是一个类型时,对于类型T,样本测试函数的名称应该是 ExampleT

  • 当被测试对象是某个类型中的一个方法时,对于类型T的方法M,样本测试函数的名称应该是 ExampleT_M

如果需要在样本测试函数的名称上添加后缀,那么需要用下划线把该后缀与名称的其他部分分隔开。并且,该后缀的首字母必须小写。例如:针对类型 T 的方法 M 且需要加入后缀 basic 的样本测试函数的名称应该是 ExampleT_M_basic

结语

本篇我们讲解了Go语言的样本测试,下一篇我们了解Go语言的测试运行记录和覆盖率的内容,敬请期待!!!