用go测试跳过一些测试

vib*_*blo 44 testing go

是否有可能跳过/排除某些测试go test

我有相当多的集成类型测试,它将休息服务称为标准的go测试,并运行go test.当开发新功能时,它有时可以跳过一些测试,例如,如果新功能尚未部署在测试服务器上,并且我仍然想要运行所有现有测试(除了那些新的测试之外)新功能).

我知道-run,但我不想指定我想要运行的所有测试,这将是一个很长的列表.与此同时,我还没能编写一个排除测试的正则表达式.

另一个选择是不提交不在同一分支中运行的测试,但如果我只能指定要排除的内容会更容易.

One*_*One 45

VonC说的那样,你可以使用+build标签

?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? ls
a_test.go  b_test.go  c_test.go
Run Code Online (Sandbox Code Playgroud)

a_test.go:

package tags

import "testing"

func TestA(t *testing.T) {}
Run Code Online (Sandbox Code Playgroud)

b_test.go:

// +build !feature1

package tags

import "testing"

func TestB(t *testing.T) {}
Run Code Online (Sandbox Code Playgroud)

c_test.go:

// +build !feature1
// +build !feature2

package tags

import "testing"

func TestC(t *testing.T) {}
Run Code Online (Sandbox Code Playgroud)

然后使用-tags参数运行测试:

?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? go test -v . | grep PASS:
--- PASS: TestA (0.00 seconds)
--- PASS: TestB (0.00 seconds)
--- PASS: TestC (0.00 seconds)
?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? go test -v -tags feature1 . | grep PASS:
--- PASS: TestA (0.00 seconds)
?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? go test -v -tags feature2 . | grep PASS:
--- PASS: TestA (0.00 seconds)
--- PASS: TestB (0.00 seconds)
Run Code Online (Sandbox Code Playgroud)

//更新:不同的逻辑:

a_test.go:

// +build all

package tags

import "testing"

func TestA(t *testing.T) {}
Run Code Online (Sandbox Code Playgroud)

b_test.go:

// +build all feature1

package tags

import "testing"

func TestB(t *testing.T) {}
Run Code Online (Sandbox Code Playgroud)

c_test.go:

// +build all feature2

package tags

import "testing"

func TestC(t *testing.T) {}


?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? go test -v -tags all | grep PASS:
--- PASS: TestA (0.00 seconds)
--- PASS: TestB (0.00 seconds)
--- PASS: TestC (0.00 seconds)
?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? go test -v -tags feature1 | grep PASS:
--- PASS: TestB (0.00 seconds)
?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? go test -v -tags="feature1 feature2" | grep PASS:
--- PASS: TestB (0.00 seconds)
--- PASS: TestC (0.00 seconds)
Run Code Online (Sandbox Code Playgroud)

或者您按名称调用特定测试,例如:

d_test.go:

package tags

import "testing"

func TestA1(t *testing.T) {}
func TestB1(t *testing.T) {}
func TestC1(t *testing.T) {}
func TestD1(t *testing.T) {}
Run Code Online (Sandbox Code Playgroud)

输出:

?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? go test -run="(A|B)1" -v | grep PASS:
--- PASS: TestA1 (0.00 seconds)
--- PASS: TestB1 (0.00 seconds)
?? oneofone@Oa [/t/tst-tag]                                                                                                      
???? go test -run="D1" -v | grep PASS:
--- PASS: TestD1 (0.00 seconds)
Run Code Online (Sandbox Code Playgroud)

  • 没有立刻看到你的答案.+1 (2认同)

Vad*_*rov 38

测试包SkipNow()Skip()方法.因此,可以使用以下内容进行单独测试:

func skipCI(t *testing.T) {
  if os.Getenv("CI") != "" {
    t.Skip("Skipping testing in CI environment")
  }
}

func TestNewFeature(t *testing.T) {
  skipCI(t)
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以设置环境变量或运行CI=true go test以设置CI为命令本地变量.

另一种方法是使用短模式.将以下防护添加到测试中

if testing.Short() {
  t.Skip("skipping testing in short mode")
}
Run Code Online (Sandbox Code Playgroud)

然后用.执行测试 go test -short

  • 现在,这似乎是更好的答案。 (4认同)
  • 非常有用,因为在 GitHub actions 中,环境变量 CI 默认设置为 true:https://docs.github.com/en/actions/learn-github-actions/environment-variables (2认同)

F56*_*566 6

对Vadym Tyemirov 答案的补充。

TestMain当 env CI 不为空时,您可以在整个 pkg 中使用跳过测试。

func TestMain(m *testing.M) {
    if os.Getenv("CI") == "" {
        m.Run()
    }
}
Run Code Online (Sandbox Code Playgroud)


Sou*_*ode 5

go 1.20 test 命令现在接受 -skip 来跳过测试、子测试或匹配的示例。

https://tip.golang.org/doc/go1.20