Go测试文件必须命名为xxx_test.go且与被测文件同目录同包;测试函数须为func TestXxx(t *testing.T)格式,首字母大写、参数为指针类型;go test默认仅运行当前目录测试,需用-v查看输出、-run精确匹配函数名。

测试文件命名和位置必须严格匹配 Go 的约定
Go 不会自动扫描任意 _test.go 文件——它只认**与被测代码同目录、同 package、且以 _test.go 结尾**的文件。常见错误是把 calculator_test.go 放错目录,比如放在 tests/ 子目录下,或和 calculator.go 不在同一级路径,结果 go test 直接报 no test files in current directory。
- 源码文件
utils.go→ 测试文件必须叫utils_test.go,且和它在同一目录 - package 声明必须一致:如果
utils.go是package utils,那utils_test.go也得是package utils(不是package utils_test) - 不要用
go mod init初始化时漏掉go.sum或go.mod——否则go test可能因模块解析失败而静默跳过测试
测试函数签名写错会导致 go test 完全忽略该函数
go test 只执行形如 func TestXxx(t *testing.T) 的函数。哪怕只是少个星号、参数名写成 tt、多加一个返回值,这个函数就变成普通函数,不会被识别为测试用例,也不会报错提示——它只是“不存在”。
- 正确:
func TestAdd(t *testing.T) - 错误:
func TestAdd(t testing.T)(缺*)、func TestAdd(t *testing.T) error(多了返回值)、func testAdd(t *testing.T)(小写开头) - 注意大小写:
Testadd或testAdd都无效;必须是 PascalCase 且首字母大写
运行命令选错会让测试“看似成功实则没跑”
go test 默认只跑当前目录的测试;如果你在项目根目录执行,但测试文件在 pkg/math/ 下,它什么都不会做。更隐蔽的问题是:不加 -v 时,成功测试默认无输出,容易误以为“没反应=没跑”。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
- 只跑当前包:
go test(确保 cd 进对了目录) - 看详细过程(强烈推荐):
go test -v,失败时显示具体哪一行t.Errorf触发 - 递归跑所有子包:
go test ./...(注意是./...,不是./) - 单测某个函数:
go test -run ^TestDivide$(^和$锚定全名,避免匹配到TestDivideWithRemainder)
私有函数不能直接测,强行调用会破坏封装且不可靠
Go 的可见性规则在测试中依然生效:func calculate()(小写开头)在 *_test.go 里根本无法访问,编译直接失败。试图用 reflect 或 unsafe 强行调用,不仅让测试脆弱、难维护,还会绕过类型检查,掩盖真实设计缺陷。
立即学习“go语言免费学习笔记(深入)”;
- 正确做法:通过导出函数(如
Add)的输入组合,覆盖私有函数的所有分支 - 必要时可将核心逻辑提取为导出函数,加注释说明:
// Exported for testing only - 绝对避免:
reflect.ValueOf(...).Call(...)调用未导出方法——这会让测试在 Go 版本升级后突然崩溃
go test 挂住十分钟才超时。

















