使用go测试跳过一些测试

hrirmatl  于 2023-02-27  发布在  Go
关注(0)|答案(4)|浏览(260)

是否可以跳过/排除某些测试,使其不使用go test运行?
我有相当多的集成类型测试,它们调用一个以标准go测试编写的rest服务,并使用go test运行。当一个新特性被开发时,跳过一些测试有时是有用的,例如,如果新特性还没有部署在测试服务器上,我仍然想运行所有现有的测试(除了那些测试新特性的新测试)。
我知道-run,但是我不想指定所有我想运行的测试,那会是一个很长的列表。同时我还不能写一个正则表达式来排除测试。
另一个选择是不提交不在同一分支中运行的测试,但是如果我可以指定要排除的内容,那会更容易。

gjmwrych

gjmwrych1#

Testing packageSkipNow()Skip()方法,因此,可以在单个测试之前添加类似以下内容:

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

func TestNewFeature(t *testing.T) {
  skipCI(t)
}

然后可以设置环境变量或运行CI=true go testCI设置为命令局部变量。
另一种方法是使用短模式。

if testing.Short() {
  t.Skip("skipping testing in short mode")
}

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

q7solyqu

q7solyqu2#

正如VonC所说,您可以使用+build标记

┌─ oneofone@Oa [/t/tst-tag]                                                                                                      
└──➜ ls
a_test.go  b_test.go  c_test.go
    • a_测试。开始:**
package tags

import "testing"

func TestA(t *testing.T) {}
    • b_测试.执行:**
// +build !feature1

package tags

import "testing"

func TestB(t *testing.T) {}
    • c_测试.执行:**
// +build !feature1
// +build !feature2

package tags

import "testing"

func TestC(t *testing.T) {}

然后使用-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)

//更新:不同逻辑:

    • a_测试。开始:**
// +build all

package tags

import "testing"

func TestA(t *testing.T) {}
    • b_测试.执行:**
// +build all feature1

package tags

import "testing"

func TestB(t *testing.T) {}
    • c_测试.执行:**
// +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)

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

    • d_测试。开始:**
package tags

import "testing"

func TestA1(t *testing.T) {}
func TestB1(t *testing.T) {}
func TestC1(t *testing.T) {}
func TestD1(t *testing.T) {}

输出:

┌─ 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)
yizd12fk

yizd12fk3#

Vadym Tyemirov's answer的补充。
当env CI不为空时,您可以在整个 Package 中使用TestMain跳过测试。

func TestMain(m *testing.M) {
    if os.Getenv("CI") == "" {
        m.Run()
    }
}
3pvhb19x

3pvhb19x4#

go 1.20测试命令现在接受-skip以跳过测试、子测试或匹配的示例。
https://tip.golang.org/doc/go1.20

相关问题