t.Skip 和 t.SkipNow 可跳过测试,前者支持消息参数,后者无参;构建标签可编译时排除测试文件;-run 和 -skip(Go 1.22+)支持运行时动态过滤测试。

使用 t.Skip 跳过当前测试
在测试函数内部调用 t.Skip() 可以立即终止当前测试并标记为“跳过”。它常用于运行时判断不满足条件(如环境缺失、依赖未就绪)时主动退出,避免报错。
示例:
func TestAPIWithAuth(t *testing.T) {
if os.Getenv("API_TOKEN") == "" {
t.Skip("API_TOKEN not set, skipping integration test")
}
// 后续测试逻辑
}
注意:t.Skip() 之后的代码不会执行,且该测试不会计入失败数,结果中显示为 skipped。
用 t.SkipNow 提前结束测试
t.SkipNow() 和 t.Skip() 行为一致,都是立即停止当前测试。区别在于 t.SkipNow() 不接受参数,若需带说明信息,仍应使用 t.Skip("msg")。
立即学习“go语言免费学习笔记(深入)”;
常见写法:
- 条件成立时直接跳过:
if !hasNetwork() { t.SkipNow() } - 推荐统一用 t.Skip,语义更清晰、可读性更好
通过构建标签(build tags)控制测试编译
Go 支持用构建约束跳过整个测试文件的编译,适合彻底屏蔽平台相关或资源密集型测试。
在测试文件顶部添加注释:
//go:build integration
// +build integration
package mypkg
func TestExpensiveIntegration(t *testing.T) { ... }
运行时需显式启用标签:
-
go test -tags=integration—— 运行带该标签的测试 -
go test(默认)—— 忽略该文件
多个标签可用逗号或空格分隔,例如 //go:build linux && cgo。
用 -run 和 -skip 迌行时过滤测试
Go test 命令提供原生命令行选项,在不改代码的前提下动态控制执行范围:
-
go test -run=^TestUnit—— 只运行名称匹配正则的测试(如 TestUnitXXX) -
go test -run='^(?!TestLegacy).*$'—— 排除特定名称(需 shell 支持,zsh/bash 下建议加引号) -
go test -skip="TestHelper|TestMock"—— Go 1.22+ 新增,直接跳过匹配名称的测试函数
注意:-skip 是 Go 1.22 引入的功能,旧版本可用 -run 配合反向正则模拟,但不如原生支持稳定。










