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