Go语言精进之路读书笔记第40条——理解包内测试与包外测试的差别
测试代码存放在包含TestXxx函数的以*_test.go文件名结尾的文件中
40.1 官方文档的“自相矛盾”
包内测试:测试代码放在与被测包同名的包中
包外测试:测试代码放在名为被测包包名+"_test"的包中
40.2 包内测试与包外测试
包内测试:
- 优:白盒测试,高覆盖率
- 缺:测试代码自身需要经常性的维护;容易有包循环引用的硬伤
- 循环引用的例子:strings包和testing包,strings包引用testing包,而testing包又引用了strings包
包外测试(仅针对导出API的测试):
- 优:黑盒测试,测试代码健壮,不需要经常调整逻辑;无循环引用的问题
- 缺:存在测试盲区,覆盖率低,可通过安插后门的方式解决
- 安插后门的例子:
$GOROOT/src/fmt/export_test.go
和$GOROOT/src/strings/export_test.go
- 不包含任何测试代码,仅用于将被测包的内部符号在测试阶段暴露给包外测试代码
export_test.go
文件仅在go test
阶段与被测试包(fmt)一并被构建入最终的测试二进制文件中
- 安插后门的例子:
结论:
- 优先使用包外测试
- 包外测试更适合编写偏向集成测试的用例,包内测试可以聚焦于验证内部逻辑的正确性