17370845950

Golang如何查看测试覆盖率 Go test cover使用教程
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 是两回事,后者才是生成数据的前提。

打开可视化 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 不认它。

真正难的不是命令怎么敲,而是红色那几行背后藏着的边界条件、错误路径、并发时序——工具只告诉你“没跑过”,但为什么没跑过,得回看测试用例设计本身。