最直接的临时跳过方式是调用 t.Skip() 或 t.SkipNow():前者打印信息后退出,后者立即终止;需在 t.Parallel() 后调用,支持 go test -v 显示 skipped 统计。

用 t.Skip() 或 t.SkipNow() 临时跳过测试用例
最直接的方式是在测试函数内部调用 t.Skip() 或 t.SkipNow()。两者区别在于:t.Skip() 会打印跳过信息并正常退出当前测试;t.SkipNow() 立即终止执行,不运行后续语句。
常见使用场景包括:环境不满足(如缺少 API key)、依赖服务未就绪、或仅在 CI 中才应运行的用例。
-
t.Skip("requires DB_URL")适合带说明的条件跳过 - 必须在
t.Parallel()之后调用,否则 panic - 跳过不会影响测试计数中的 “skip” 统计(
go test -v会显示 skipped)
用 -run 和 -skip 在命令行过滤测试名
Go 原生命令行参数支持按名称匹配启用或排除测试,比写代码跳过更轻量,适合调试阶段快速筛选。
-
go test -run=TestLogin只运行名字含TestLogin的函数 -
go test -run=^TestAPI.*$用正则匹配(注意 shell 转义,建议加引号) -
go test -run='^(?!TestLegacy).*$'排除以TestLegacy开头的用例(需 Go 1.21+,且正则引擎支持负向先行断言)
注意:-skip 参数在标准 go test 中并不存在 —— 这是常见误解,实际没有该 flag。想“排除”,只能靠 -run 配合正则模拟。
用构建标签(build tags)做编译期条件控制
当某些测试**完全不应出现在特定环境**(如 Windows 上跳过 Unix socket 测试),构建标签比运行时跳过更彻底:它们让 Go 编译器直接忽略对应文件或函数。
- 在测试文件顶部加
//go:build !windows,该文件在 Windows 下不参与编译 - 对单个函数,可用
//go:build integration+go test -tags=integration显式启用 - 多个标签用逗号分隔:
//go:build linux,amd64
注意:旧式 // +build 注释已弃用,必须用 //go:build(Go 1.17+ 强制);且前后需空行。
用环境变量或配置驱动跳过逻辑(推荐用于 CI/本地切换)
把跳过条件外移到环境变量,能让同一份测试代码在不同环境表现不同,避免硬编码和频繁修改。
func TestExternalAPI(t *testing.T) {
if os.Getenv("SKIP_EXTERNAL") == "1" {
t.Skip("SKIP_EXTERNAL set")
}
// ... 实际测试逻辑
}
- 本地运行:
SKIP_EXTERNAL=1 go test - CI 中可统一设置环境变量,集中管控高成本或不稳定测试
- 比
-run更灵活:可组合多个条件(如os.Getenv("CI") == "true" && os.Getenv("DB_TYPE") == "postgres")
容易被忽略的是:环境变量检查必须放在 t.Parallel() 之前,否则可能因并发导致跳过行为不可控;另外,别忘了在 CI 配置里显式导出这些变量,否则默认为空字符串。










