Go测试如何只运行单个测试_Go test筛选测试方法

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

只运行单个测试函数:用 -run 配正则锚点

Go 默认会运行包里所有以 Test 开头的函数,想只跑一个?核心是 go test -run 加上**精确正则匹配**。不加锚点(^$)很容易误中副车。

  • go test -run TestAdd 会同时触发 TestAddTestAddUserTestAddress —— 因为它们都包含子串 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,多打两个字符 ^$ —— 值得。