
Go 的 go test -bench 默认不会跳过失败的单元测试,但可通过 -run NONE 显式禁用所有测试,从而强制执行基准测试。
go 的 `go test -bench` 默认不会跳过失败的单元测试,但可通过 `-run none` 显式禁用所有测试,从而强制执行基准测试。
在 Go 中,go test 命令默认将测试(-test)和基准测试(-bench)视为同一执行流程中的不同阶段:只有当所有指定的测试函数(即匹配 -run 模式的测试)成功通过后,基准测试才会启动。这意味着,若包中存在失败的测试(例如 TestFoo 断言失败),即使你只关心性能数据,go test -bench=. 也会提前终止,不运行任何基准函数(如 BenchmarkBar)。
这并非隐式“设计缺陷”,而是 Go 测试框架的默认行为逻辑:它假设测试失败可能反映代码处于不稳定状态,此时测量性能缺乏意义。但开发调试或性能迭代过程中,你往往需要在功能尚未完全正确时观察性能趋势——例如验证某次重构是否显著降低开销,或对比两个未完成实现的算法。
✅ 正确解决方案是使用 -run 标志显式控制哪些测试被执行:
# 完全跳过所有测试,仅运行基准测试(推荐) go test -bench=. -run=NONE # 或者更精确地跳过所有以 Test 开头的函数(效果等价) go test -bench=. -run="^$" # 若只想运行特定测试 + 基准,可组合使用(注意顺序) go test -bench=BenchmarkSort -run=TestSortCorrectness
⚠️ 注意事项:
- -run NONE 中的 NONE 是一个特殊字符串,不是正则表达式,而是 go test 内部识别的“匹配空字符串”的快捷写法(等价于 -run="" 或 -run="^$"),确保无测试函数被选中;
- 不要误写为 -run=none(小写)或 -run=NoTest,这些会被当作普通正则模式,可能意外匹配到测试名;
- 基准测试本身不受 -run 影响,只要 -bench 非空且匹配到函数,就会执行;
- 若同时使用 -short 或 -count,它们与 -run NONE 完全兼容,例如:go test -bench=. -run=NONE -count=5 可进行多次基准采样。
总结:Go 并未提供“忽略测试失败继续跑 benchmark”的开关,但通过 -run=NONE 主动排除测试执行,即可安全、可靠地单独运行基准测试——这是官方支持且广泛使用的惯用做法,适用于 CI 调试、性能回归分析及早期原型验证等场景。










