go test -cover仅显示当前包覆盖率百分比,需用-go test -coverprofile生成coverage.out文件,再通过-go tool cover -html生成可视化报告,-func查看函数级覆盖,CI中可校验阈值。

直接看覆盖率百分比:用 go test -cover
想快速知道当前包测试覆盖了多少语句,就跑这一条命令:go test -cover。它会在终端输出类似 coverage: 65.2% of statements 的结果,干净利落。
但注意:这只是“一句话总结”,不告诉你哪行没测、哪个 if 分支漏了,也不能跨子包汇总。如果你只在某个子目录下执行,它默认只测当前包;想测整个模块,得加 ./:
-
go test -cover ./→ 覆盖当前模块所有子包(推荐) -
go test -cover ./pkg/http→ 只测指定子包 - 没加
-coverprofile,就永远拿不到可定位的详细报告
生成可分析的覆盖率数据文件:go test -coverprofile
要真正查漏补缺,必须先生成 profile 文件,比如 coverage.out。核心命令是:
go test -coverprofile=coverage.out -covermode=count ./
立即学习“go语言免费学习笔记(深入)”;
这里三个关键点:
-
-coverprofile=coverage.out:指定输出文件名,必须带扩展名,Go 不会自动补 -
-covermode=count:记录每行执行次数(不只是“是否执行过”),对分析分支覆盖、热点逻辑更准;CI 中若需并发安全,可用atomic替代 -
./:确保覆盖全部子包;如果漏掉这个点,只跑当前目录,coverage.out里可能只有零星几行数据
常见错误:只写 go test -cover 就以为能出 HTML 报告——不行,-cover 和 -coverprofile 是两回事,后者才是生成数据的前提。
打开可视化 HTML 报告:go tool cover -html
有了 coverage.out,就能生成带颜色高亮的网页报告:
go tool cover -html=coverage.out -o coverage.html
然后打开 coverage.html,你会看到:
- 绿色:该行被执行过
- 红色:完全没进过(重点补测试的地方)
- 灰色:空行、注释、
default分支等不可执行或忽略项
几个容易卡住的点:
- 必须在**生成
coverage.out的同一路径下**运行go tool cover,否则报错open xxx.go: no such file or directory(因为 profile 里存的是相对/绝对路径) - 不支持直接指定端口或起服务,如需本地预览,用
python3 -m http.server 8000启个静态服务再访问 - 点击函数名可跳转到对应源码位置,比对着终端日志一行行翻快得多
查函数级覆盖和 CI 自动校验:go tool cover -func
在终端快速扫一遍哪些函数拖了后腿,用这个命令:
go tool cover -func=coverage.out
输出像这样:
mathutil/mathutil.go:3: Max 100.0% total: (statements) 100.0%
适合放进 CI 脚本做阈值检查。例如要求整体不低于 80%,可以这样提取数值:
COVER=$(go tool cover -m coverage.out | tail -n +2 | awk '{sum += $3} END {print int(sum/NR)}')[[ $COVER -ge 80 ]] || (echo "Coverage too low: ${COVER}%"; exit 1)
注意:-coverpkg 参数只有配合 -coverprofile 才生效,用于覆盖被测包中调用的内部依赖包;纯 -cover 不认它。
真正难的不是命令怎么敲,而是红色那几行背后藏着的边界条件、错误路径、并发时序——工具只告诉你“没跑过”,但为什么没跑过,得回看测试用例设计本身。










