如何获取Golang项目所有包的完整测试覆盖率?
Go跨目录测试覆盖率统计异常解决方案
问题原因
Go原生go test默认只会统计当前测试文件所在包的代码覆盖率,你的集成测试放在integration包下,跑测试的时候默认不会把它调用的mon包代码计入覆盖率,所以你第一次跑出来的mon包覆盖率只有单测的51.8%。
你用go-acc时覆盖率反而更低,是因为你同时传入了new-project/anto/...和.两个重复路径,导致工具重复执行测试、计算逻辑出错,最终覆盖率计算异常。
解决方法
方法1:用原生go test实现(推荐,无需安装第三方工具)
核心是通过-coverpkg参数指定你要统计覆盖率的所有业务包范围,步骤如下:
- 进入项目根目录(即
go.mod文件所在的目录) - 执行以下命令生成覆盖率统计文件:
go test -coverprofile=coverage.out -coverpkg=./anto/... ./anto/...
参数说明:
-coverprofile=coverage.out:将覆盖率数据输出到coverage.out文件-coverpkg=./anto/...:指定要统计anto目录下所有包的覆盖率,不管测试用例在哪个目录./anto/...:指定要执行anto目录下所有的测试用例(包含单测和集成测试)
- 查看文本格式的覆盖率明细,执行:
go tool cover -func=coverage.out
输出结果里会包含每个包的准确覆盖率,最后一行是项目总覆盖率,你可以直接搜索mon包对应的行查看包含集成测试的完整覆盖率。
4. 如果需要可视化查看具体哪行代码没被覆盖,执行:
go tool cover -html=coverage.out
会自动打开浏览器展示带颜色标记的代码覆盖情况。
方法2:正确使用go-acc工具
你之前的参数错误,去掉重复的路径即可:
- 进入项目根目录
- 直接执行:
go-acc ./anto/...
go-acc本质就是自动帮你拼接-coverpkg参数,不需要额外传多余路径,就能得到正确的全量覆盖率数据。
内容的提问来源于stack exchange,提问作者AntoCode
相关产品推荐
相关产品推荐

