web-dev-qa-db-fra.com

Ignorez certains tests avec go test

Est-il possible de sauter/exclure certains tests d'être exécutés avec go test?

J'ai un assez grand nombre de tests de type d'intégration qui appellent un service de repos écrit en tant que tests go standard et exécutés avec go test. Lorsqu'une nouvelle fonctionnalité est développée, il est parfois utile de pouvoir ignorer certains des tests, par exemple si la nouvelle fonctionnalité n'est pas encore déployée sur le serveur de test et que je souhaite toujours exécuter tous les tests existants (sauf ceux qui testent la nouvelle fonctionnalité).

Je connais -run, mais je ne veux pas spécifier tous les tests que je veux exécuter, ce serait une longue liste. En même temps, je n'ai pas pu écrire d'expressions rationnelles pour exclure les tests.

Une autre option serait de ne pas valider les tests qui ne s'exécutent pas dans la même branche, mais ce serait plus facile si je pouvais simplement spécifier ce qu'il faut exclure.

40
viblo

Comme VonC dit, vous pouvez utiliser +build Mots clés

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

Exécutez ensuite le test avec le -tags paramètre:

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

// Mise à jour: logique différente:

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)

Ou vous appelez des tests spécifiques par leur nom comme:

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

Production:

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

Package de test a les méthodes SkipNow() et Skip(). Ainsi, un test individuel pourrait être précédé de quelque chose comme ceci:

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

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

Vous pouvez ensuite définir la variable d'environnement ou exécuter CI=true go test pour définir CI comme variable locale de commande.

Une autre approche serait d'utiliser mode court . Ajouter la garde suivante à un test

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

puis exécutez vos tests avec go test -short

31
Vadym Tyemirov