



Go从对外发布的那一天起就包含了go test命令,这个命令会执行_test.go中符合TestXxx命名规则的函数进而实现测试代码的执行。go test并没有对测试代码的组织提出任何约束条件。于是早期的测试代码采用了十分简单直接的组织方式—— 平铺 。
下面是对 Go 1.5 版本标准库strings包执行测试后的结果:
# go test -v . === RUN TestCompare --- PASS: TestCompare (0.00s) === RUN TestCompareIdenticalString --- PASS: TestCompareIdenticalString (0.00s) === RUN TestCompareStrings --- PASS: TestCompareStrings (0.00s) === RUN TestReader --- PASS: TestReader (0.00s) ... === RUN TestEqualFold --- PASS: TestEqualFold (0.00s) === RUN TestCount --- PASS: TestCount (0.00s) ... PASS ok strings 0.457s
我们看到,以strings包的Compare函数为例,与之对应的测试函数有三个:TestCompare、TestCompareIdenticalString和TestCompareStrings。这些测试函数各自独立,测试函数之间没有层级关系, 所有测试平铺在顶层 。测试函数名称既用来区分测试,又用来关联测试。我们通过测试函数名的前缀才会知道,TestCompare、TestCompareIdenticalString和TestCompareStrings三个函数是针对strings包Compare函数的测试。
在go test命令中,我们还可以通过给命令行选项-run提供正则表达式来匹配并选择执行哪些测试函数。还以strings包为例,下面的命令仅执行测试函数名字中包含TestCompare前缀的测试:
# go test -run=TestCompare -v . === RUN TestCompare --- PASS: TestCompare (0.00s) === RUN TestCompareIdenticalString --- PASS: TestCompareIdenticalString (0.00s) === RUN TestCompareStrings --- PASS: TestCompareStrings (0.00s) PASS ok strings 0.088s
平铺 模式的测试代码组织方式的优点是显而易见的。