go test -cover 显示 0.0% 表示测试未运行,主因是_test.go 命名错误、Test 开头缺失、目录执行错误或未写测试函数;需用 go test -v 验证是否输出 === RUN TestXXX,并通过 go test -coverprofile=coverage.out ./ 生成报告,再用 go tool cover -html=coverage.out 查看具体未覆盖行。

直接跑 go test -cover 看到 coverage: 0.0% of statements,基本可以断定:测试根本没跑起来,不是代码难测,是测试没被识别。
为什么 go test -cover 总显示 0.0%?
这不是覆盖率低,是压根没触发任何测试函数。常见原因包括:
-
_test.go文件名写错,比如叫handler_tests.go或test_handler.go(必须严格以_test.go结尾) - 测试函数没以
Test开头,例如写了func checkLogin()(必须是func TestLogin(t *testing.T)) - 在错误目录执行命令:被测代码在
internal/service/,却在项目根目录只跑go test -cover(它默认不递归子包) - 根本没写
func TestXxx(t *testing.T),只写了辅助函数或main
先用 go test -v 确认输出里有没有 === RUN TestXXX —— 没这行,就等于没开始跑测试。
怎么生成真正可用的覆盖率数据?
go test -cover 只给一个百分比,完全无法定位哪行漏了。必须生成 coverage.out 文件才能分析:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
- 命令必须带等号:
go test -coverprofile=coverage.out ./(写成-coverprofile coverage.out会静默失败) - 结尾的
./表示当前目录及所有子包,缺了它,internal/或pkg/下的包可能被跳过 -
coverage.out是二进制文件,别用cat或编辑器打开,它只供go tool cover解析 - 如果项目有
vendor,避免加-mod=vendor以外的干扰参数,否则工具可能找不到原始源码
如何精准定位未覆盖的分支?
HTML 报告里的红色行才是真问题,但得先正确生成和访问:
- 别双击打开
coverage.html—— 现代浏览器禁用file://协议下的 JS,必然空白 - 正确做法是运行
go tool cover -html=coverage.out,它会自动起服务(默认http://localhost:59090) - 报告中绿色 = 执行过,红色 = 完全未执行(如
else、if err != nil、defer块),灰色 = 不可执行代码(注释、函数签名等),不用管 - 重点关注
go tool cover -func=coverage.out输出里标0.0%、33.3%、50.0%的函数——这些数字背后通常是 error 分支没 mock、defer因提前return没触发、或context取消路径完全没走
哪些代码永远进不了覆盖率统计?
覆盖率工具只统计被测试用例直接或间接 import 并执行的代码,以下情况天然排除:
-
main函数(除非你专门写测试去调它) - 未被任何测试文件 import 的工具函数(即使在同一包,没被引用就不算)
- 带
// +build ignore的条件编译文件 - 由
go:generate生成的代码(除非生成后文件被测试直接执行) - 空函数体或只调空函数的分支(会被计为“已覆盖”,但逻辑安全毫无保障)
最常被忽略的是:灰色行不是漏洞,红色行才是;而 switch 缺 default 却所有 case 都覆盖了,报告仍显示 100%,但兜底逻辑实际裸奔。

















