t.Skip 和 t.SkipNow 可跳过测试,前者支持消息参数,后者无参;构建标签可编译时排除测试文件;-run 和 -skip(Go 1.22+)支持运行时动态过滤测试。
在测试函数内部调用 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.Skip() 行为一致,都是立即停止当前测试。区别在于 t.SkipNow() 不接受参数,若需带说明信息,仍应使用 t.Skip("msg")。
常见写法:
if !hasNetwork() { t.SkipNow() }
Go 支持用构建约束跳过整个测试文件的编译,适合彻底屏蔽平台相关或资源密集型测试。
在测试文件顶部添加注释:
//go:build integration
// +build integration
package mypkg
func TestExpensiveIntegration(t *testing.T) { ... }
运行时需显式启用标签:
go test -tags=integration —— 运行带该标签的测试go test(默认)—— 忽略该文件多个标签可用逗号或空格分隔,例如 //go:build linux && cgo。
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 配合反向正则模拟,但不如原生支持稳定。