应使用 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 匹配的是函数名,不是文件名。只要函数名符合正则,不管它在 user_test.go 还是 auth_test.go,都会被拉进来执行。
TestValidateEmail 拆到多个文件里,但还想一键全跑user_test.go 里的 TestCreate,而 admin_test.go 里也有同名函数,-run "^TestCreate$" 会两个都跑 —— 这时得换思路(见下一条)当你用 -bench 跑性能测试时,go test 默认仍会先执行所有 Test* 函数 —— 这可能失败、耗时、甚至改变状态,影响基准结果。
-run ^$ 是最干净的解法:go test -bench MapTravel -run ^$,意思是“匹配空字符串开头结尾”,即不匹配任何测试函数-run "" 或省略,它们行为不一致,有些版本会报错或退化为跑全部-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()
^ 是转义符,要用双引号包裹整个正则,例如:go test -run "^TestAdd$",PowerShell 同理真正麻烦的从来不是语法,而是你以为匹配到了,其实只是子串撞上了;或者你改了函数名,却忘了同步更新 CI 脚本里的 -run 参数。每次敲 -run,多打两个字符 ^$ —— 值得。