go test 直接指定_test.go文件报undefined,因默认按包编译且不自动引入同包其他文件;正确做法是进包目录运行go test,或显式列出所有依赖文件如go test t1.go t1_test.go。

go test 命令直接指定_test.go 文件就报 undefined?
这是新手最常撞上的墙:执行 go test t1_test.go 却提示 undefined: SayHI。原因很实在——go test 默认按“包”编译,而单独指定测试文件时,它不会自动拉入同包的其他 .go 文件(比如你的 t1.go)。
- 正确做法是进入包目录后直接运行
go test,不带任何文件名 - 若真要测单个文件,必须显式列出所有依赖源文件:
go test t1.go t1_test.go - 更安全的做法是统一用
go test -v,避免遗漏隐式依赖
测试里调用真实数据库或 HTTP 接口,结果时好时坏?
测试失败飘忽不定,十有八九是因为没隔离外部依赖。真实网络请求、数据库写入、文件读写这些操作自带延迟、状态和副作用,会让测试变慢、不可靠、难复现。
- 把依赖抽象成接口(例如
type UserRepository interface { GetByID(int) (*User, error) }) - 在测试中传入 mock 实现,而非真实 DB client
- 绝对不要在
TestMain里初始化全局 DB 连接;每个测试应控制自己的依赖生命周期
表驱动测试写了但总漏掉错误路径?
表驱动测试不是“多写几组数”就完事了。很多人的 tests := []struct{...} 里只有正常输入,一碰到 nil、空字符串、负数、超长字段就挂。
- 每条测试用例必须明确标注是否预期出错:
hasError bool - 边界值不能靠感觉:除零、切片越界、JSON 解析失败、time.Parse 的非法格式都要覆盖
- 别用
_忽略 error:写成_, err := fn()再不检查,等于没测异常流
并发测试里 goroutine 跑飞了,测试秒过但逻辑根本没执行?
加了 go func() { ... }() 就跑 go test,结果测试函数退出了,goroutine 还卡在 channel 发送或 http.Do 上——这不算通过,是漏测。
- 必须同步:用
sync.WaitGroup等待所有 goroutine 结束 - 或者加超时控制:
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) - 禁用并行调试时,可临时删掉
t.Parallel(),避免干扰排查
最易被忽略的一点:测试通过 ≠ 逻辑正确。比如一个函数返回 (result, nil),你只断言 result,却从不验证 error 是否该非 nil——这种“伪覆盖”在线上会突然爆发。










