go test -run 只匹配以 test 开头、接收 *testing.t 参数的导出函数,需确保大小写精确、正则锚定(如 "^testlogin$"),子测试须通过 ide 点击字符串字面量运行,-race 与 -count 不宜叠加。

go test -run 只匹配函数名,不是文件名或方法名
必须用 TestXXX 这样的函数名,不能写 xxx_test.go 或结构体方法名。Go 的测试发现机制只扫描形如 func TestLogin(t *testing.T) 的导出函数——签名不对、没导出、包不一致,-run 直接无视。
- 确保函数以
Test开头、接收*testing.T参数、位于与被测代码同一 package - 函数名大小写敏感:
testlogin不会匹配TestLogin - 如果测试在子包(比如
auth/),得先cd auth再运行,或显式指定go test ./auth -run TestLogin - 不在当前目录执行?
go test会报no Go files in ...或静默跳过——它只看当前工作目录下的包结构
正则边界 ^ 和 $ 不加就容易误中多个测试
像 go test -run Login 会同时跑 TestLogin、TestLoginError、TestAutoLogin,结果看似“成功”,实则验证了错误的东西。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 精确匹配务必写成
go test -run "^TestLogin$" - Windows 命令行对单引号支持差,统一用双引号并转义美元符:
go test -run "^(TestLogin)$" - 不确定函数名是否被识别?先跑
go test -list .看当前包所有可识别的测试名,再构造正则 - 空匹配不会报错,只会输出
ok . 0.001s——你以为跑成功了,其实一个没跑
表驱动子测试要单独运行,得靠 IDE 精准点击字符串字面量
GoLand 或 VS Code 无法靠函数名直接运行 t.Run("invalid_token", ...) 这类子测试,必须依赖 IDE 对静态字符串的索引能力。
- 子测试名必须是纯 ASCII 字符串字面量,
t.Run("中文", ...)或t.Run(fmt.Sprintf(...), ...)都不可识别 - 右键运行时,光标必须落在双引号内的字符串上(比如点中
"invalid_token"这几个字符),点括号、逗号或空格都会退化为运行整个TestAuth - 首次使用前建议先执行一次完整
go test -v,让 IDE 完成测试树构建;否则右键菜单里压根不显示子测试项 - 调试子测试时,断点必须设在
t.Run的回调函数体内,不能只设在t.Run(...)调用行
-race 和 -count 叠加可能让单测行为失真
想边查竞态边多跑几轮?go test -run TestCache -race -count=3 看似合理,实际会让每次执行都启动 race detector,内存暴涨、超时风险陡增,还可能因全局状态污染导致偶发失败。
-
-race本身让程序慢 2–5 倍,-count=3是乘性放大,不是简单重复三次 - 涉及文件、网络、共享 map 的测试,
-count下多次执行大概率互相干扰 - 真要多轮验证,用 shell 循环更干净:
for i in {1..5}; do go test -run TestCache; done - 若必须用
-race,优先单次执行,配合-v观察日志,别叠加-count
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










