go test -cover 输出0.0%是因为未执行任何测试,常见原因包括_test.go命名错误、Test函数命名不规范、在错误目录运行命令或缺少Test函数;-covermode=count适用于无并发的单测,-covermode=atomic用于含goroutine的并发场景,二者不可与-race共存。

Go 原生 go test -cover 就够用,不需要额外装工具——它不是“辅助工具”,而是编译时插桩机制的一部分,直接参与测试执行流程。
为什么 go test -cover 输出的覆盖率是 0.0%?
这不是覆盖率低,是根本没跑测试。常见原因有四个:
-
_test.go文件名拼错,比如写成handler_tests.go或test_handler.go - 测试函数没以
Test开头,例如写了func checkLogin()而不是func TestLogin() - 在错误目录执行命令:handler 在
internal/handler/,却只在根目录跑go test -cover(它不会自动递归进子包) - 没写任何
func TestXxx(t *testing.T),只写了辅助函数或main入口
先运行 go test -v,看到 === RUN TestXXX 才算真正触发了测试。
-covermode=count 和 -covermode=atomic 怎么选?
两者都记录执行次数,但并发安全性和性能取舍不同:
立即学习“go语言免费学习笔记(深入)”;
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- 单测里没启动 goroutine(比如没调
http.ListenAndServe、没用time.AfterFunc),用-covermode=count:速度快、输出易读、和go test -race不冲突 - 测试中启用了并发(比如 handler 里开了 goroutine 处理异步任务),必须用
-covermode=atomic,否则计数会漏掉,覆盖率虚低 -
-covermode=set只记“是否执行过”,粒度太粗,基本不用;-covermode=func只到函数级,定位不到具体行
注意:-covermode=atomic 和 -race 不能共存,会报错 cannot use -race and -covermode=atomic together。
HTML 报告点不开源码文件?路径映射错了
生成 coverage.html 后点击文件名跳转失败,90% 是路径问题:
- 必须在项目根目录(即
go.mod所在目录)运行命令,否则go tool cover解析源码路径时会错位 - Windows 下避免路径含空格或中文;统一用正斜杠
/,反斜杠\容易被解析失败 - 如果用了
vendor,别加-mod=vendor以外的干扰参数,否则 cover 工具可能找不到原始源码
验证方法:打开 coverage.html 源码,看 <a href="..."> 里的路径是不是你项目里真实存在的相对路径。
覆盖率数字本身不暴露逻辑缺陷——比如一个 if err != nil { log.Fatal() } 分支被覆盖了,但 log.Fatal() 是空函数,也会被算作“已覆盖”。真正要盯的是 go tool cover -func=coverage.out 输出里那些 0.0%、33.3% 的函数,它们背后往往是没测的 error 分支、defer 清理、context cancel 路径。

















