应使用 go test -run "^TestAdd$" 精确匹配函数名,避免子串误匹配;需注意大小写敏感、跨文件执行同名测试、配合 -bench 时用 -run ^$ 跳过普通测试。

只运行单个测试函数:用 -run 配正则锚点
Go 默认会运行包里所有以 Test 开头的函数,想只跑一个?核心是 go test -run 加上**精确正则匹配**。不加锚点(^ 和 $)很容易误中副车。
-
go test -run TestAdd会同时触发TestAdd、TestAddUser、TestAddress—— 因为它们都包含子串TestAdd - 正确写法是:
go test -run "^TestAdd$",确保只匹配函数名完全等于TestAdd的那个 - 如果测试在子目录或非当前模块,记得补上包路径,比如:
go test ./pkg/auth -run "^TestLogin$" - 大小写敏感:
-run testlogin不会匹配TestLogin,必须大小写一致
跨文件运行同名测试:-run 不关心文件位置
-run 匹配的是函数名,不是文件名。只要函数名符合正则,不管它在 user_test.go 还是 auth_test.go,都会被拉进来执行。
- 适合场景:你重构了测试,把
TestValidateEmail拆到多个文件里,但还想一键全跑 - 反例:如果你只想跑
user_test.go里的TestCreate,而admin_test.go里也有同名函数,-run "^TestCreate$"会两个都跑 —— 这时得换思路(见下一条) - 没有“只跑某个文件里的某个测试”的原生 flag;若真需隔离,只能临时注释/重命名其他同名函数,或改用文件指定方式(不推荐,易出错)
避免干扰:跳过普通测试只跑基准测试
当你用 -bench 跑性能测试时,go test 默认仍会先执行所有 Test* 函数 —— 这可能失败、耗时、甚至改变状态,影响基准结果。
- 加上
-run ^$是最干净的解法:go test -bench MapTravel -run ^$,意思是“匹配空字符串开头结尾”,即不匹配任何测试函数 - 别用
-run ""或省略,它们行为不一致,有些版本会报错或退化为跑全部 - 注意顺序:flag 顺序无关,但
-bench和-run必须同时存在才生效;单独-run ^$只是跳过测试,不会触发基准测试
常见错误现象与排查线索
命令没反应、报 no test files、或者该跑的没跑、不该跑的全跑了——多数是这几个点卡住。
-
no test files:当前目录没*_test.go,或文件里没func TestXxx(t *testing.T)形式的函数(比如写成func testXxx()少了T参数) - 测试函数没执行:检查是否拼错函数名,比如
TestLogin写成TestLogIn;或用了-run "Login"却忘了加Test前缀 - 输出里有
skip字样:说明函数被识别到了,但被if testing.Short() { t.Skip() }或构建标签(如//go:build integration)跳过,需加对应-tags或去掉t.Skip() - Windows 用户注意:cmd 中
^是转义符,要用双引号包裹整个正则,例如:go test -run "^TestAdd$",PowerShell 同理
真正麻烦的从来不是语法,而是你以为匹配到了,其实只是子串撞上了;或者你改了函数名,却忘了同步更新 CI 脚本里的 -run 参数。每次敲 -run,多打两个字符 ^$ —— 值得。










