直接用 go test -cover 查总覆盖率,如 coverage: 62.4% of statements;用 go test -coverprofile=coverage.out -covermode=count 生成数据,再通过 go tool cover -html=coverage.out 生成交互式 HTML 报告;用 go tool cover -func=coverage.out 按函数查看覆盖率并筛选低覆盖项。

直接看总覆盖率:用 go test -cover 快速验证
想一秒知道当前包的语句覆盖比例,不用生成文件,直接跑:
go test -cover ./输出类似
coverage: 62.4% of statements。这个数值只统计被测试实际执行到的代码行(statement-level),不包含注释、空行、func init() 或未调用的方法。注意:它默认只测当前目录下的包,子包不会自动包含;如果测试里调用了其他包的函数,那些包的代码也不会被计入——除非你显式加 -coverpkg。
生成可交互 HTML 报告:定位哪一行没测到
光看百分比不够,得知道红在哪、绿在哪。go test -coverprofile=coverage.out -covermode=count ./ 先生成原始数据,再转成带颜色高亮的网页:
go tool cover -html=coverage.out -o coverage.html打开
coverage.html,绿色是已覆盖,红色是完全没执行过,灰色是不可覆盖(比如 default: 分支、结构体定义、纯声明)。点击左侧文件名能跳转到对应源码,还能点函数名展开看内部每行状态。常见坑:终端里执行 go tool cover -html=... 有时会报 open /dev/tty: no such device or address,这不是错,只是环境不支持自动唤起浏览器——手动用 Chrome 打开 coverage.html 就行。
按函数查漏补缺:go tool cover -func 筛低覆盖函数
团队里常有“某个函数写完了但忘了测”的情况。用这命令把每个函数的覆盖率列出来:
go tool cover -func=coverage.out输出像:
mathutil/mathutil.go:3: Max 100.0%、handler/user.go:45: UpdateUser 0.0%。这时就可以针对性补测试。想快速揪出低于 80% 的函数:go tool cover -func=coverage.out | awk ' < 80 {print}'注意:0.0% 不一定代表漏测——也可能是函数里有 panic 后面的代码永远走不到,或是条件编译(如 // +build ignore)导致整块被跳过。
CI 中强制守门:用 -covermode=atomic 防并发干扰
在 GitHub Actions 或 GitLab CI 里做覆盖率兜底时,别用 count 模式——它在并发测试下可能因竞态导致计数不准。atomic 是唯一支持并发安全的模式,适合 CI 场景:
go test -coverprofile=coverage.out -covermode=atomic ./之后提取数值校验:
COVER=$(go tool cover -func=coverage.out | tail -1 | awk '{print $3}' | sed 's/%//')
[[ $COVER -ge 80 ]] || (echo "Coverage $COVER% < 80%"; exit 1)这里容易忽略的是:如果项目含多个子包,go test ./ 默认只保留最后一个包的 coverage.out,要合并多包数据得先分包生成再用脚本或 gocov 工具处理——原生命令不支持自动合并。
真正卡住人的往往不是命令记不住,而是误以为“生成了 report 就等于全覆盖”:未导出的私有方法、init 函数、跨包调用路径没用 -coverpkg 声明、甚至 go:generate 生成的代码都不在默认统计范围内。覆盖率是镜子,不是保险单。










