[TOC] # 简介 Go 程序编写三类测试,即:功能测试(test)、基准测试(benchmark,也称性能测试),以及示例测试(example) 一般情况下,一个测试源码文件只会针对于某个命令源码文件,或库源码文件(以下简称被测源码文件)做测试,所以我们总会(并且应该)把它们放在同一个代码包内 测试源码文件的主名称应该以被测源码文件的主名称为前导,并且必须以“\_test”为后缀。例如,如果被测源码文件的名称为 demo52.go,那么针对它的测试源码文件的名称就应该是 demo52\_test.go 每个测试源码文件都必须至少包含一个测试函数。并且,从语法上讲,每个测试源码文件中,都可以包含用来做任何一类测试的测试函数,即使把这三类测试函数都塞进去也没有问题。我通常就是这么做的,只要把控好测试函数的分组和数量就可以了 # 对测试函数的名称和签名规定 这里我给出的典型回答是下面三个内容。 * 对于功能测试函数来说,其名称必须以Test为前缀,并且参数列表中只应有一个\*testing.T类型的参数声明。 * 对于性能测试函数来说,其名称必须以Benchmark为前缀,并且唯一参数的类型必须是\*testing.B类型的。 * 对于示例测试函数来说,其名称必须以Example为前缀,但对函数的参数列表没有强制规定 # 基于表的测试方式 在 Go 语言中,有一种常用的测试套路,叫做**基于表的测试方式**,其核心就是我们需要针对不同的场景,其实也就是不同的输入和输出来验证一个功能。例如我们要验证的`Add`函数,我们需要验证的功能点有很多,例如: * 两个正数相加是否正确 * 两个负数相加是否正确 * 一个正数加上一个负数是否正确 * 有一个数为 0 是否正确 那么,我们就可以使用**基于表的测试方式**了,代码可以这样写 ~~~ func TestMultiAdd(t *testing.T) { var tests = []struct{ Arg1 int Arg2 int sum int } { {1, 1, 2}, {-1, -1, -2}, {1, -1, 0}, {0, 1, 1}, } for _, test := range tests { sum := Add(test.Arg1, test.Arg2) if sum != test.sum { t.Errorf("Add %v and %v result isn't %v", test.Arg1, test.Arg2, test.sum) } } } ~~~