最稳路径是用 go test -coverprofile 生成数据再用 go tool cover -html 查看;go test -cover 数字不准因仅统计当前目录被 import 的代码且默认用 -covermode=set,定位分支需 -covermode=count。

直接用 go test -coverprofile 生成数据文件,再用 go tool cover -html 打开看——这是最稳、最不容易出错的路径。别信“一行命令搞定”的封装脚本,它们常默认漏掉 -covermode=count 或路径处理错,导致覆盖率虚高或 HTML 点不开。
为什么 go test -cover 显示的数字不准?
它只统计当前目录下被测试文件 import 的代码,不包含:main 函数、未被引用的工具函数、// +build ignore 排除的文件、go:generate 生成的代码。更关键的是:它用的是 -covermode=set(只记“有没有执行”),而你真正需要定位“哪条 if 分支没走”,得用 count 模式。
- 想快速检查整体水位:用
go test -cover ./(注意./,否则只测当前包) - 想补全测试:必须加
-covermode=count -coverprofile=coverage.out,否则 HTML 报告里看不到执行次数,红色行也看不出是“完全没跑”还是“只跑了一次” - 如果测试里起了 goroutine(比如调了
http.ListenAndServe或time.AfterFunc),换-covermode=atomic,否则计数可能少算
go tool cover -html 点文件名打不开源码?
根本原因是路径解析错位:HTML 里链接的路径是相对于模块根目录(go.mod 所在位置)的,但你双击打开 coverage.html 时,浏览器工作目录不是那里。Windows 下还容易因反斜杠崩溃。
- 必须在
go.mod所在目录运行命令:go test -covermode=count -coverprofile=coverage.out ./ && go tool cover -html=coverage.out -o coverage.html - 不要用 Finder / 文件管理器双击打开 HTML,而是终端里执行:
open coverage.html(macOS)或start coverage.html(Windows) - 项目用了
vendor?确保没加-mod=vendor以外的干扰参数,否则go tool cover找不到原始源码
CI 里上传到 Codecov 失败,90% 是格式和路径问题
Codecov 不认 coverage.out,它要的是 gcov 格式或 JSON;而且它比对的是 Git 仓库的相对路径,不是你本地磁盘路径。
立即学习“go语言免费学习笔记(深入)”;
- 先转格式:
go install github.com/ory/go-acc@latest,然后用go-acc -o coverage.json ./... - 上传前确认:生成
coverage.json的目录就是 Git 仓库根目录,且git status干净 - 别用
-coverpkg强拉依赖包进报告——那只是把别人包的覆盖率数字算进你的总分,对本包质量毫无意义
最容易被忽略的一点:灰色代码行(函数签名、case 标签、空行)不算入分母,但 if err != nil { return } 这种单行提前退出,只要 err 是 nil,整行就不计入统计——看起来覆盖率高,其实错误路径完全没验证。盯 go tool cover -func coverage.out 输出里那些 0.0% 的函数,比总百分比有用得多。


















