Loading

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)一并被构建入最终的测试二进制文件中

结论:

  • 优先使用包外测试
  • 包外测试更适合编写偏向集成测试的用例,包内测试可以聚焦于验证内部逻辑的正确性
posted @ 2024-02-29 13:54  brynchen  阅读(11)  评论(0编辑  收藏  举报