Go测试开箱即用:需_test.go文件、TestXxx函数名、*testing.T参数;go test默认执行当前目录测试,-v显示详情,-run匹配函数名,t.Errorf宜用于表驱动测试以暴露全部错误。

Go 的测试不是“配好环境才能跑”,而是开箱即用——只要文件名是 _test.go、函数名以 Test 开头、参数是 *testing.T,go test 就能识别并执行。
如何让 go test 找到并运行你的测试
Go 不依赖配置文件或目录结构判断测试,只认两个硬规则:
- 测试文件必须以
_test.go结尾(如calculator_test.go),且和被测代码在同一个包里 - 测试函数必须形如
func TestXxx(t *testing.T),不能有返回值,不能少参数 - 如果函数名写成
testAdd或TestAdd()(带括号)或func TestAdd(t testing.T)(漏了*),go test直接忽略它
运行命令默认找当前目录下所有 *_test.go 文件:go test —— 静默运行,只报错go test -v —— 显示每个测试函数名和结果go test -run TestAdd —— 只跑名字匹配的测试(支持正则,如 -run ^TestAdd$)
为什么 t.Errorf 比 t.Fatal 更常用
多数场景下,你希望一次看到所有失败点,而不是一个错就中断:
-
t.Errorf("got %d, want %d", got, want):记录错误,继续执行该测试函数内剩余逻辑 -
t.Fatal("setup failed"):立即终止当前测试函数,常用于前置条件失败(如 DB 连不上) - 误用
t.Fatal在表驱动测试里会导致后续用例全跳过,掩盖真实问题
例如在循环中验证多个输入时,用 t.Error 或 t.Errorf 才能一次性暴露全部不一致项。
测试文件命名直接影响集成测试能否隔离
Go 没有“测试类型”元数据,靠文件名和 -tags 控制执行范围:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
service_test.go:默认参与go test,适合纯内存/无依赖的单元测试 -
service_integration_test.go:需显式加-tags=integration才运行,比如要启 MySQL 容器的测试 - 漏加
-tags却写了连本地 Redis 的代码,CI 会直接失败;更糟的是,有人把这种测试混在普通_test.go里,导致每次go test都卡住
CI 脚本里常见写法:go test -tags=integration ./... 或 go test -short ./...(配合 if testing.Short() { t.Skip() } 跳过耗时操作)
覆盖率报告容易误导,但 -race 不能省
go test -cover 只统计“行是否被执行”,不反映分支逻辑是否全覆盖。100% 覆盖率下仍可能漏掉 if err != nil 的 error path。
真正关键的是竞态检测:go test -race 会在运行时插桩检查 goroutine 间数据竞争,一旦发现直接报错。这是并发程序的底线保障,比覆盖率数字重要得多。
本地开发时建议固定加上:go test -race -v
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










