-go test -run 参数通过正则匹配测试函数名,需注意作用域为包而非文件,精确匹配用^TestName$,路径需显式指定,-v可验证匹配结果。

用 -run 参数精准匹配测试函数名
Go 的 go test 默认运行当前包下所有以 Test 开头的函数,但你可以通过 -run 指定正则表达式来只跑某一个。它匹配的是测试函数名(不是文件名或注释),且不区分大小写。
-
-run后跟的字符串会被当作 Go 正则处理,所以^MyTest$能精确锚定,而MyTest可能意外匹配到MyTestHelper - 如果测试函数在子目录(如
./internal/foo),需先定位到该目录再执行,或用go test ./internal/foo -run=^TestFoo$ - 函数名中含下划线、数字、大写字母时,正则要写全,比如
TestUser_Login_WithToken应写成-run=^TestUser_Login_WithToken$
常见错误:路径、包名、函数名三者混淆
很多人输完命令发现没运行、报错“no test files”,其实是搞错了作用域。Go 测试命令作用范围是「包」,不是「文件」。
- 不要写
go test my_test.go -run=TestFoo——go test不接受单个 .go 文件作为参数(除非用-file,但那是编译模式) - 不要写
go test -run=TestFoo在项目根目录却期望运行cmd/myapp/main_test.go里的测试 —— 它只会找当前目录下的*_test.go - 如果测试在
testdata/或examples/这类非标准包路径下,得显式指定包路径:go test ./testdata -run=^TestExample$
快速验证是否匹配成功的小技巧
加 -v 参数可看到每个被选中的测试函数名和运行状态,比盲试更可靠。
go test -v -run=^TestLogin$
输出类似:
立即学习“go语言免费学习笔记(深入)”;
=== RUN TestLogin --- PASS: TestLogin (0.01s) PASS
如果没看到 === RUN 行,说明没匹配上——这时回看函数名拼写、是否漏了 Test 前缀、是否多打了空格或符号。
进阶:跳过其他测试但保留 setup/teardown 逻辑
有些测试依赖 TestMain 或全局 init(),单独跑一个函数时这些仍会执行。但要注意:TestMain 是包级入口,只要该包有任一测试被运行,它就会触发。
- 若想跳过
TestMain,只能改代码或临时注释掉它 - 如果测试用了
t.Parallel(),单独运行时它无效(无并发上下文),但不会报错 - 使用
t.Cleanup()注册的清理函数仍会执行,哪怕只跑一个测试
真正容易被忽略的是:-run 不影响测试文件的编译阶段。哪怕你只跑 TestA,TestB 里语法错误或未定义变量照样导致 go test 失败。










