go test -cover 默认不显示覆盖率数字,需配合 -v 参数才能输出如 coverage: 65.2% of statements;无测试文件时静默忽略;跨包需 -coverpkg;生成 html 报告须经 go test -coverprofile + go tool cover -html 两步。

go test -cover 为什么没输出覆盖率数字
默认 go test 不显示覆盖率数值,只跑测试不生成报告。必须显式加 -cover 才触发计算,但仅加这个参数仍可能看不到数字——因为默认输出模式是 short,覆盖率只在详细模式下打印。
- 加
-v查看详细输出,go test -v -cover才会显示类似coverage: 65.2% of statements - 如果包里没写任何测试(
*_test.go文件为空或没Test*函数),-cover会静默忽略,不报错也不提示 - 跨包导入时,
-cover默认只统计当前包,子包需用-coverpkg=./...显式包含
生成 HTML 覆盖率报告的完整命令链
Go 自带的 go tool cover 是唯一可靠方案,第三方工具容易和新版 Go 不兼容。关键不是“装工具”,而是走对三步:生成 profile、转换格式、启动查看。
- 先运行
go test -coverprofile=coverage.out -covermode=count:-covermode=count比atomic更准,适合本地调试;atomic仅在并发测试时必要 - 再执行
go tool cover -html=coverage.out -o coverage.html,打开coverage.html即可交互查看 - 注意
coverage.out是二进制格式,不能直接读;误删或覆盖后必须重跑测试,无法从 HTML 反向生成
CI 环境下覆盖率上传失败的常见原因
GitHub Actions / GitLab CI 里跑 go test -cover 后传不到 Coveralls 或 Codecov,大概率卡在路径或格式上。
- Go 的
coverprofile输出路径是相对当前工作目录的,CI 中常因cd或working-directory设置导致路径错位 - Codecov 推荐用
-covermode=atomic,否则并发测试可能漏统计;但atomic在 Go 1.20+ 才稳定,旧版 CI 镜像可能不支持 - 别信
go get github.com/.../cover这类老教程——Go 1.16+ 已弃用go get安装命令行工具,所有cover功能都在go tool cover里
多个包一起测时 -coverpkg 怎么写才不漏
单测一个 main 包却想看到它依赖的 internal 包覆盖率?-coverpkg 必须列全,且路径要和 go list 输出一致,不能靠猜。
立即学习“go语言免费学习笔记(深入)”;
- 先运行
go list ./...看所有子包路径,排除 vendor 和 testdata - 再拼成
-coverpkg=github.com/your/repo,github.com/your/repo/internal/utils,github.com/your/repo/model,用英文逗号分隔,不能有空格 - 如果用了 Go Module,路径必须是 module path,不是文件系统相对路径;
./...在-coverpkg里无效
coverage.out 写到了容器外或被清理了。别急着换工具,先 ls -l coverage.out 确认文件真实存在且可读。










