viblo
viblo

Reputation: 4603

Skip some tests with go test

Is it possible to skip/exclude some tests from being run with go test?

I have a fairly large amount of integration type tests which call a REST service written as standard go tests, and run with go test. When a new feature is developed it's sometimes useful to be able to skip some of the tests, for example if the new feature is not yet deployed on the testing server and I still want to run all the existing tests (except those new ones which tests the new feature).

I know about -run, but I don't want to specify all tests I want to run, that would be a long list. At the same time I have not been able to write a regex for excluding tests.

Another option would be to not commit the tests which don't run in the same branch, but it would be easier if I could just specify what to exclude.

Upvotes: 122

Views: 114160

Answers (5)

thiagowfx
thiagowfx

Reputation: 5760

From the command-line:

go test -skip 'TestA|TestB'

Upvotes: 2

Source code
Source code

Reputation: 321

The go 1.20 test command now accepts -skip to skip tests, subtests, or examples matching .

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

Upvotes: 7

F566
F566

Reputation: 645

Supplement to the Vadym Tyemirov's answer.

You can use TestMain skip test in whole pkg when env CI not empty.

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

Upvotes: 9

Vadym Tyemirov
Vadym Tyemirov

Reputation: 8853

Testing package has SkipNow() and Skip() methods. So, an individual test could be prepended with something like this:

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

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

You could then set the environment variable or run CI=true go test to set CI as a command-local variable.

Another approach would be to use short mode. Add the following guard to a test

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

and then execute your tests with go test -short

Upvotes: 192

OneOfOne
OneOfOne

Reputation: 99351

Like VonC said, you can use +build tags

┌─ oneofone@Oa [/t/tst-tag]                                                                                                      
└──➜ ls
a_test.go  b_test.go  c_test.go

a_test.go :

package tags

import "testing"

func TestA(t *testing.T) {}

b_test.go :

// +build !feature1

package tags

import "testing"

func TestB(t *testing.T) {}

c_test.go :

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

package tags

import "testing"

func TestC(t *testing.T) {}

Then run the test with the -tags parameter :

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

// Update : different logic :

a_test.go:

// +build all

package tags

import "testing"

func TestA(t *testing.T) {}

b_test.go:

// +build all feature1

package tags

import "testing"

func TestB(t *testing.T) {}

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)

Or you call specific tests by name like :

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) {}

Output:

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

Upvotes: 77

Related Questions