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 ./
这里三个关键点:
-coverprofile=coverage.out:指定输出文件名,必须带扩展名,Go 不会自动补-covermode=count:记录每行执行次数(不只是“是否执行过”),对分析分支覆盖、热点逻辑更准;CI 中若需并发安全,可用 atomic 替代./:确保覆盖全部子包;如果漏掉这个点,只跑当前目录,coverage.out 里可能只有零星几行数据常见错误:只写 go test -cover 就以为能出 HTML 报告——不行,-cover 和 -coverprofile 是两回事,后者才是生成数据的前提。
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 启个静态服务再访问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 不认它。
真正难的不是命令怎么敲,而是红色那几行背后藏着的边界条件、错误路径、并发时序——工具只告诉你“没跑过”,但为什么没跑过,得回看测试用例设计本身。