上QQ阅读APP看书,第一时间看更新
40.1 官方文档的“自相矛盾”
Go原生支持测试的两大要素——go test命令和testing包,它们是Gopher学习Go代码测试的必经之路。
下面是关于testing包的一段官方文档(Go 1.14版本)摘录:
要编写一个新的测试集(test suite),创建一个包含TestXxx函数的以_test.go为文件名结尾的文件。将这个测试文件放在与被测试包相同的包下面。编译被测试包时,该文件将被排除在外;执行go test时,该文件将被包含在内。
同样是官方文档,在介绍go test命令行工具时,Go文档则如是说:
那些包名中带有_test后缀的测试文件将被编译成一个独立的包,这个包之后会被链接到主测试二进制文件中并运行。
对比这两段官方文档,我们发现了一处“自相矛盾”[1]的地方:testing包文档告诉我们将测试代码放入与被测试包同名的包中,而go test命令行帮助文档则提到会将包名中带有_test后缀的测试文件编译成一个独立的包。
我们用一个例子来直观说明一下这个“矛盾”:如果我们要测试的包为foo,testing包的帮助文档告诉我们把对foo包的测试代码放在包名为foo的测试文件中;而go test命令行帮助文档则告诉我们把foo包的测试代码放在包名为foo_test的测试文件中。
我们把将测试代码放在与被测包同名的包中的测试方法称为“包内测试”。可以通过下面的命令查看哪些测试源文件使用了包内测试:
$go list -f={{.TestGoFiles}} .
我们把将测试代码放在名为被测包包名+"_test"的包中的测试方法称为“包外测试”。可以通过下面的命令查看哪些测试源文件使用了包外测试:
$go list -f={{.XTestGoFiles}} .
那么我们究竟是选择包内测试还是包外测试呢?在给出结论之前,我们将分别对这两种方法做一个详细分析。