go test -cover 只显示覆盖率数字,要定位未覆盖代码需用 -coverprofile 生成 coverage.out 再通过 go tool cover -html 查看html报告;-covermode=count 可统计分支执行次数;报告路径必须与生成时一致,且需通过本地http服务访问。

直接跑 go test -cover 只能看个数字,真要定位哪行没测到,必须生成 coverage.out 再用 go tool cover -html 转成可点击的 HTML 报告——否则你永远在猜。
为什么 go test -cover 显示 0.0% 或根本没输出
这不是覆盖率低,是压根没跑进测试函数。常见原因有:
-
*_test.go文件名拼错,比如写成util_test.go.bak或test_util.go - 测试函数没以
Test开头,或参数不是*testing.T(比如写了func testFoo()) - 当前不在包目录下执行,而是在模块根目录用
go test ./却漏掉了子包路径,导致部分测试被跳过 - 没写任何测试函数,或者
go test -v输出里完全没出现TestXXX行
生成 coverage.out 必须带 -coverprofile,不能只用 -cover
-cover 只是终端打印一行 summary,-coverprofile 才真正记录每行是否执行、执行几次。关键点:
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
- 想看分支执行次数(比如 if/else 哪边没走),必须加
-covermode=count;默认set模式只记“有没有跑过”,对调试帮助小 - 覆盖整个模块所有子包:用
go test -coverprofile=coverage.out -covermode=count ./(注意末尾的./) - 只测某个子包:比如
go test -coverprofile=coverage.out -covermode=count ./pkg/http -
coverage.out是二进制格式,不能手动编辑,也不能跨路径使用——后面go tool cover必须在生成它的同一目录下运行
go tool cover -html 打不开或页面空白
双击 coverage.html 在 Chrome/Firefox 里打不开,不是文件坏了,是浏览器禁了 file:// 协议加载 JS。解决方法只有两个:
- 不加
-o参数,直接运行go tool cover -html=coverage.out,它会自动起一个本地 HTTP 服务(默认http://localhost:59090),浏览器访问这个地址就行 - 手动起静态服务:
python3 -m http.server 8000,把coverage.html放进当前目录,然后打开http://localhost:8000/coverage.html - 别拖进浏览器、别右键“在浏览器中打开”、别改后缀名——这些操作全无效
HTML 报告里灰色/红色/绿色行分别代表什么
打开报告后看到的颜色不是随意标色,对应明确语义:
- 绿色:该行被执行过(至少一次)
- 红色:该行完全没被执行(比如
if false { ... }里的代码,或未覆盖的else分支) - 灰色:不可执行或忽略项,包括空行、注释、
default分支(即使没写)、函数签名、type定义等——这些不参与覆盖率计算,也不该去补测试
最容易被忽略的是:报告里的路径是相对路径,如果 coverage.out 是在 /home/user/myproj 下生成的,但你把它拷到桌面再跑 go tool cover,就会报 open xxx.go: no such file or directory —— 不是文件丢了,是路径对不上。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










