go test -run 只匹配测试函数名中test前缀后的部分,不支持路径或文件名;需确保函数导出且签名正确,推荐先用go test -list .验证函数是否被识别。

go test -run 只匹配测试函数名,不支持路径或文件名
直接用 go test -run TestName 就能跑单个测试函数,但很多人卡在“为什么写了文件名或路径没用”。-run 后面只接受正则表达式,且只匹配 func TestXXX(t *testing.T) 中的 XXX 部分(即函数名去掉 Test 前缀后的字符串),和文件、目录、包路径完全无关。
- ✅ 正确:当前目录下有
func TestLoginSuccess(t *testing.T),运行go test -run LoginSuccess - ❌ 错误:写
go test -run ./auth/login_test.go或go test -run auth.TestLoginSuccess—— 这两个都会静默忽略,不报错也不执行 - ⚠️ 注意:如果函数名含下划线或大写字母,正则需严格对应,比如
TestAPI_CreateUser要写-run API_CreateUser,写-run api_createuser不会命中
多个测试函数名匹配时,-run 会全部执行
-run 的值是 Go 内置正则引擎处理的,不是精确字符串匹配。哪怕你只想跑一个,只要别的测试函数名也包含那段子串,就会被拉进来。
- 常见翻车:写
go test -run User,结果TestUserLogin、TestUserProfile、TestUserDelete全跑了 - 更安全的做法是加锚点或边界符:
go test -run "^UserLogin$"或go test -run "UserLogin$"(结尾锚定) - 如果函数名有共用前缀(如
TestHTTP*),建议统一命名风格,避免靠猜来缩小范围
必须在对应包目录下运行,或显式指定包路径
go test 默认对当前目录下的 *_test.go 文件生效。不在包根目录执行,很可能找不到测试函数,或者误跑其他包的测试。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- ✅ 推荐做法:cd 到含测试文件的包目录,再运行
go test -run XXX - ✅ 也可跨目录调用:
go test ./auth -run LoginSuccess,这时./auth是包路径,-run仍只作用于该包内的测试函数名 - ❌ 不要从项目根目录随便跑
go test -run XXX,除非你确认当前目录就是目标测试所在的包,否则可能什么也不执行,还误以为命令失效
测试函数未导出或签名错误会导致 -run 完全静默跳过
Go 测试框架只识别满足两个硬条件的函数:首字母大写的导出函数 + 精确签名 func TestXXX(t *testing.T)。缺一不可,且不会报错提示。
- 常见静默失败场景:
func testLogin(t *testing.T)(小写开头)、func TestLogin(t *testing.T, ctx context.Context)(多参数)、func TestLogin(t *testing.B)(用了B而非T) - 验证是否被识别:加
-v参数,正常会输出=== RUN TestXXX;如果加了-v却没任何RUN行,基本就是函数没被识别 - 注意:
go test -list .可列出当前包所有可识别的测试函数名,是排查“为什么跑不起来”的第一手工具
真正容易漏掉的是函数签名和导出规则——它们不报错,也不提示,只是默默跳过。每次 -run 失效,先跑一遍 go test -list . 看名字列出来没有,比反复改正则更快。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










