如何在Golang中跳过特定测试_Skip和条件执行测试用例

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")

常见写法:

  • 条件成立时直接跳过: 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 配合反向正则模拟,但不如原生支持稳定。