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