go test -coverprofile 必须配合 -covermode=count 生成 coverage.out 文件,再用 go tool cover -html 生成可交互html报告;路径错误、编码问题或浏览器安全策略易致报告空白,ci中需确保路径一致并显式上传产物。

go test -coverprofile 生成覆盖率数据文件
Go 原生不直接输出 HTML 报告,必须先生成 coverprofile 文件。漏掉这步或路径写错,后续就全白忙。
关键点:用 -covermode=count(而非 atomic 或 set),否则 go tool cover 解析时可能报 parse error: unexpected EOF 或统计不准。
-
go test -covermode=count -coverprofile=coverage.out ./...—— 覆盖整个模块,coverage.out是约定俗成的文件名,可自定义但需保持一致 - 若只测单个包,去掉
./...改为./pkgname;测试子目录时注意路径是否包含_test.go文件 - 如果项目含 cgo 或依赖外部构建约束,需加
-tags参数,否则部分文件不参与覆盖率统计
go tool cover -html 生成 HTML 报告
这是最简路径,但容易因路径或编码问题打不开报告。
执行 go tool cover -html=coverage.out -o coverage.html 后,生成的 coverage.html 是纯静态文件,双击在浏览器打开即可 —— 但 Windows 上默认用 IE 打开会失败,务必用 Chrome/Firefox 手动拖入或用 open coverage.html(macOS)或 start coverage.html(Windows PowerShell)启动。
- 生成的 HTML 中点击文件名可跳转到带高亮的源码行,绿色=覆盖,红色=未覆盖,灰色=不可覆盖(如
if false、函数签名等) - 若页面空白或报
Failed to load resource,大概率是浏览器安全策略阻止了本地 file:// 协议加载 JS,换用python3 -m http.server起个本地服务再访问http://localhost:8000/coverage.html -
-html不支持自定义模板或主题,想加 CI 集成图标或导出 PDF?得换工具(比如gocov或gotestsum)
覆盖率数值不准?检查测试是否真正运行了目标代码
常见假高覆盖率:测试跑过了,但没进分支、没触发错误路径、mock 没生效 —— go tool cover 只统计「被执行过的行」,不管逻辑是否完备。
- 用
go tool cover -func=coverage.out查看各函数覆盖率,快速定位低覆盖函数,比如utils.go:42.12-45.2 0.0%表示该函数完全没被调用 - HTTP handler 测试中忘了
httptest.NewRecorder()或没调handler.ServeHTTP(),会导致路由逻辑不计入覆盖率 - 使用
gomock或testify/mock时,若 mock 对象没被实际传入被测函数,对应分支仍为红色
CI 环境下生成报告要注意路径和权限
GitHub Actions / GitLab CI 中常因工作目录切换或缓存导致 coverage.out 丢失或路径错位。
- 确保
go test和go tool cover在同一工作目录执行;CI 脚本里建议显式cd $GITHUB_WORKSPACE或用绝对路径引用coverage.out - GitLab CI 默认不保留产物,需配置
artifacts: [coverage.html];GitHub Actions 则要用actions/upload-artifact显式上传 - 某些私有 CI runner 禁用了
file://协议,HTML 报告无法预览,这时应改用go tool cover -text=coverage.out输出文本摘要,或集成codecov提交到第三方平台
覆盖率数字本身不重要,重要的是哪一行没被测到、为什么没被测到。HTML 报告只是放大镜,不是验收章。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











