t.Log()
n'apparaîtra pas avant la fin du test, donc si vous essayez de déboguer un test qui se bloque ou qui fonctionne mal, il semble que vous deviez utiliser fmt
.
Oui: c'était le cas jusqu'à Go 1.13 (août 2019) inclus.
Et cela a été suivi dans le golang.org
numéro 24929
Considérez les tests automatisés (idiots) suivants:
func TestFoo(t *testing.T) {
t.Parallel()
for i := 0; i < 15; i++ {
t.Logf("%d", i)
time.Sleep(3 * time.Second)
}
}
func TestBar(t *testing.T) {
t.Parallel()
for i := 0; i < 15; i++ {
t.Logf("%d", i)
time.Sleep(2 * time.Second)
}
}
func TestBaz(t *testing.T) {
t.Parallel()
for i := 0; i < 15; i++ {
t.Logf("%d", i)
time.Sleep(1 * time.Second)
}
}
Si je cours go test -v
, je n'obtiens aucune sortie de journal jusqu'à ce que tout TestFoo
soit fait , puis aucune sortie jusqu'à ce que tout TestBar
soit terminé, et encore une fois plus de sortie jusqu'à ce que tout TestBaz
soit terminé.
C'est bien si les tests fonctionnent, mais s'il y a une sorte de bogue, il y a quelques cas où la mise en mémoire tampon de la sortie du journal est problématique:
- Lors de l'itération localement, je veux pouvoir faire un changement, exécuter mes tests, voir ce qui se passe dans les journaux immédiatement pour comprendre ce qui se passe, appuyer sur CTRL + C pour arrêter le test tôt si nécessaire, faire un autre changement, re exécutez les tests, et ainsi de suite.
Si TestFoo
c'est lent (par exemple, c'est un test d'intégration), je n'obtiens aucune sortie de journal jusqu'à la toute fin du test. Cela ralentit considérablement l'itération.
- S'il y
TestFoo
a un bogue qui le bloque et ne se termine jamais, je n'obtiendrais aucune sortie de journal. Dans ces cas, t.Log
et ne t.Logf
sont d'aucune utilité.
Cela rend le débogage très difficile.
- De plus, non seulement je n'obtiens aucune sortie de journal, mais si le test se bloque trop longtemps, soit le délai d'expiration du test Go tue le test après 10 minutes, soit si j'augmente ce délai, de nombreux serveurs CI tueront également les tests s'il n'y a pas sortie de journal après un certain temps (par exemple, 10 minutes dans CircleCI).
Alors maintenant, mes tests sont tués et je n'ai rien dans les journaux pour me dire ce qui s'est passé.
Mais pour (éventuellement) Go 1.14 (Q1 2020): CL 127120
test: sortie du journal de flux en mode détaillé
La sortie est maintenant:
=== RUN TestFoo
=== PAUSE TestFoo
=== RUN TestBar
=== PAUSE TestBar
=== RUN TestGaz
=== PAUSE TestGaz
=== CONT TestFoo
TestFoo: main_test.go:14: hello from foo
=== CONT TestGaz
=== CONT TestBar
TestGaz: main_test.go:38: hello from gaz
TestBar: main_test.go:26: hello from bar
TestFoo: main_test.go:14: hello from foo
TestBar: main_test.go:26: hello from bar
TestGaz: main_test.go:38: hello from gaz
TestFoo: main_test.go:14: hello from foo
TestGaz: main_test.go:38: hello from gaz
TestBar: main_test.go:26: hello from bar
TestFoo: main_test.go:14: hello from foo
TestGaz: main_test.go:38: hello from gaz
TestBar: main_test.go:26: hello from bar
TestGaz: main_test.go:38: hello from gaz
TestFoo: main_test.go:14: hello from foo
TestBar: main_test.go:26: hello from bar
--- PASS: TestFoo (1.00s)
--- PASS: TestGaz (1.00s)
--- PASS: TestBar (1.00s)
PASS
ok dummy/streaming-test 1.022s
Il est en effet dans Go 1.14, comme l'atteste Dave Cheney dans " go test -v
streaming output ":
Dans Go 1.14, go test -v
diffusera la t.Log
sortie au fur et à mesure, plutôt que de la thésauriser jusqu'à la fin du test .
Sous Go 1.14, les lignes fmt.Println
et t.Log
sont entrelacées , plutôt que d'attendre la fin du test, ce qui montre que la sortie du test est diffusée lorsqu'elle go test -v
est utilisée.
Avantage, selon Dave:
Il s'agit d'une excellente amélioration de la qualité de vie pour les tests de style d'intégration qui sont souvent réessayés pendant de longues périodes lorsque le test échoue.
La t.Log
sortie en continu aidera les Gophers à déboguer ces échecs de test sans avoir à attendre que le test complet expire pour recevoir leur sortie.