t.Log()
no aparecerá hasta que se complete la prueba, por lo que si está intentando depurar una prueba que se cuelga o funciona mal, parece que necesita usar fmt
.
Sí: ese fue el caso hasta Go 1.13 (agosto de 2019) incluido.
Y eso fue seguido en el golang.org
número 24929.
Considere las siguientes (tontas) pruebas automatizadas:
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 ejecuto go test -v
, no obtengo ninguna salida de registro hasta que todo TestFoo
esté hecho , luego ninguna salida hasta que todo TestBar
esté hecho, y nuevamente no más salida hasta que todo TestBaz
esté hecho.
Esto está bien si las pruebas están funcionando, pero si hay algún tipo de error, hay algunos casos en los que la salida del registro en búfer es problemática:
- Al iterar localmente, quiero poder hacer un cambio, ejecutar mis pruebas, ver lo que está sucediendo en los registros de inmediato para comprender qué está sucediendo, presionar CTRL + C para cerrar la prueba antes si es necesario, hacer otro cambio, volver a ejecutar las pruebas y así sucesivamente.
SiTestFoo
es lento (por ejemplo, es una prueba de integración), no obtengo ningún resultado de registro hasta el final de la prueba. Esto ralentiza significativamente la iteración.
- Si
TestFoo
tiene un error que hace que se cuelgue y nunca se complete, no obtendría ningún resultado de registro. En estos casos, t.Log
ya t.Logf
no sirven para nada.
Esto hace que la depuración sea muy difícil.
- Además, no solo no obtengo ningún resultado de registro, sino que si la prueba se cuelga demasiado tiempo, el tiempo de espera de la prueba de Go mata la prueba después de 10 minutos, o si aumento ese tiempo de espera, muchos servidores de CI también eliminarán las pruebas si no hay registro de salida después de una cierta cantidad de tiempo (por ejemplo, 10 minutos en CircleCI).
Así que ahora mis pruebas están eliminadas y no tengo nada en los registros que me diga qué pasó.
Pero para (posiblemente) Go 1.14 (Q1 2020): CL 127120
prueba: salida de registro de flujo en modo detallado
La salida ahora es:
=== 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
De hecho, está en Go 1.14, como lo atestigua Dave Cheney en " go test -v
salida de transmisión ":
En Go 1.14, go test -v
transmitirá la t.Log
salida a medida que ocurre, en lugar de acumularla hasta el final de la ejecución de prueba .
En Go 1.14, las líneas fmt.Println
y t.Log
se intercalan , en lugar de esperar a que se complete la prueba, lo que demuestra que la salida de la prueba se transmite cuando go test -v
se usa.
Ventaja, según Dave:
Esta es una gran mejora en la calidad de vida para las pruebas de estilo de integración que a menudo se vuelven a intentar durante períodos prolongados cuando la prueba falla.
La t.Log
salida de transmisión ayudará a los Gophers a depurar esas fallas de prueba sin tener que esperar hasta que se agote el tiempo de espera de la prueba para recibir su salida.