Go 1.16+ 自带覆盖率工具,三步完成:运行 go test -coverprofile=coverage.out -covermode=count ./ 生成报告,用 go tool cover -html=coverage.out 启动服务查看,注意 -v 显示百分比、-coverpkg 指定子包、避免 file:// 协议空白页。

直接说结论:不用装任何第三方工具,Go 1.16+ 自带完整覆盖率链路,关键在三步——跑测试生成 coverage.out、用 go tool cover 转 HTML、通过 HTTP 访问报告。
为什么 go test -cover 不显示数字?
它确实不显示——go test -cover 只触发覆盖率计算,但默认输出模式是 short,不打印百分比。必须加 -v 才能看到类似 coverage: 65.2% of statements 的行。
- 没写任何测试(
*_test.go为空或没Test*函数)时,-cover静默忽略,不报错也不提示 - 跨包调用时,
-cover默认只统计当前包;想包含internal或model等子包,必须显式加-coverpkg=github.com/your/repo,github.com/your/repo/internal -
-coverpkg的路径必须和go list ./输出一致,不能用./或相对路径,也不能有空格或换行
go test -coverprofile=coverage.out 怎么写才有效?
等号不能省,-coverprofile coverage.out(空格分隔)会静默失败,文件根本不会生成。
- 要覆盖整个模块所有子包,命令结尾必须是
./(三个点),不是.或...:go test -coverprofile=coverage.out -covermode=count ./ -
coverage.out是二进制格式,不能用cat或编辑器打开,只供go tool cover解析 - 如果项目有
vendor或testdata目录,它们会被自动排除,不用额外过滤
go tool cover -html 打开空白页怎么办?
不是文件坏了,是浏览器禁用了 file:// 协议下的 JS——HTML 报告依赖 JS 渲染高亮,双击打开必然空白。
立即学习“go语言免费学习笔记(深入)”;
- 正确做法一:运行
go tool cover -html=coverage.out(不加-o),它会自动起服务,默认监听http://localhost:59090 - 正确做法二:手动起服务,比如
python3 -m http.server 8000,然后访问http://localhost:8000/coverage.html - 别改文件名、别挪位置、别删
coverage.out——路径错一点,报告里就报open xxx.go: no such file or directory
颜色怎么看才不误判?
绿色 ≠ 全覆盖,红色 ≠ 一定得补,灰色 ≠ 没覆盖——这些颜色语义固定,看错就白忙活。
- 绿色:该行被执行 ≥1 次(但 if/else 里只测了 if 分支,else 还是红色)
- 红色:该行完全未执行(重点盯这里,尤其是
else、default、错误返回路径) - 灰色:不可执行代码(空行、注释、函数签名、
type定义),不参与统计,不用写测试去“刷绿”
最容易被忽略的是:灰色不是缺陷,红色才是真问题;而 -covermode=count 比 set 更能暴露分支遗漏,本地调试优先用它。


















