Go语言未导入包导致代码覆盖率不全,如何统计所有文件?
项目结构
-src: |- main.go |- services: |- pipeline.go |- core: |- utils.go -test: |- pipeline_test.go -go.mod
问题
我正在学习Go语言,模仿Python包结构搭建了上述项目,但计算代码覆盖率时遇到问题。执行命令:go test -coverprofile=coverage.out -covermode=atomic ./tests/...
该命令仅统计测试文件中导入的包的覆盖率,main、core等未被测试导入的包未被纳入统计。而Python会统计所有文件,请问是否有办法扫描所有文件?
解决方案
指定所有目标包路径:
不要只限定测试目录,把所有需要统计的包都加入命令的路径参数,比如:go test -coverprofile=coverage.out -covermode=atomic ./src/... ./tests/...
这样会同时测试tests目录下的用例,并统计src下所有包(main、services、core)的覆盖率。用
-coverpkg强制指定覆盖范围:
如果需要更精准控制统计的包,可通过-coverpkg参数明确指定要统计的包集合。比如要覆盖src下所有包:go test -coverprofile=coverage.out -covermode=atomic -coverpkg=./src/... ./tests/...
这个参数会强制统计指定包的代码,不管测试文件有没有导入这些包。关于main包的覆盖率补充:
如果main包的代码没被任何测试调用,即使加入统计,覆盖率会显示为0。建议把main函数里的业务逻辑抽离到其他可测试的包(比如services),或者专门编写针对main包的测试用例(比如模拟命令行启动程序的场景)。
内容的提问来源于stack exchange,提问作者zekri sidi mohamed hicham

