t.Log()
tidak akan muncul hingga pengujian selesai, jadi jika Anda mencoba men-debug pengujian yang macet atau berkinerja buruk, tampaknya Anda perlu menggunakan fmt
.
Ya: itulah yang terjadi hingga Go 1.13 (Agustus 2019) disertakan.
Dan itu diikuti dalam golang.org
edisi 24929
Pertimbangkan tes otomatis (konyol) berikut:
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)
}
}
Jika saya menjalankan go test -v
, saya tidak mendapatkan output log sampai semua TestFoo
selesai , kemudian tidak ada output sampai semua TestBar
selesai, dan sekali lagi tidak ada output lagi sampai semua TestBaz
selesai.
Ini baik-baik saja jika pengujian berfungsi, tetapi jika ada semacam bug, ada beberapa kasus di mana keluaran log buffering bermasalah:
- Saat melakukan iterasi secara lokal, saya ingin dapat membuat perubahan, menjalankan pengujian saya, melihat apa yang terjadi di log segera untuk memahami apa yang terjadi, tekan CTRL + C untuk menutup pengujian lebih awal jika perlu, buat perubahan lain, ulangi menjalankan tes, dan seterusnya.
Jika TestFoo
lambat (misalnya, ini adalah uji integrasi), saya tidak mendapatkan keluaran log hingga pengujian paling akhir. Ini secara signifikan memperlambat iterasi.
- Jika
TestFoo
memiliki bug yang menyebabkannya hang dan tidak pernah selesai, saya tidak akan mendapatkan keluaran log apa pun. Dalam kasus ini, t.Log
dan t.Logf
tidak ada gunanya sama sekali.
Ini membuat proses debug menjadi sangat sulit.
- Selain itu, saya tidak hanya mendapatkan keluaran log, tetapi jika pengujian berhenti terlalu lama, baik batas waktu pengujian Go akan menghentikan pengujian setelah 10 menit, atau jika saya meningkatkan batas waktu tersebut, banyak server CI juga akan menghentikan pengujian jika tidak ada log output setelah jangka waktu tertentu (misalnya, 10 menit di CircleCI).
Jadi sekarang tes saya dihentikan dan saya tidak memiliki apa pun di log untuk memberi tahu saya apa yang terjadi.
Tetapi untuk (mungkin) Go 1.14 (Q1 2020): CL 127120
pengujian: keluaran log streaming dalam mode verbose
Outputnya sekarang adalah:
=== 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
Ini memang ada di Go 1.14, seperti yang dibuktikan oleh Dave Cheney dalam " go test -v
output streaming ":
Di Go 1.14, go test -v
akan mengalirkan t.Log
keluaran saat terjadi, daripada menimbunnya hingga akhir uji coba .
Di bawah Go 1.14, garis fmt.Println
dan disisipkan , daripada menunggu pengujian selesai, mendemonstrasikan bahwa keluaran pengujian dialirkan saat digunakan.t.Log
go test -v
Keuntungan, menurut Dave:
Ini adalah peningkatan kualitas hidup yang bagus untuk pengujian gaya integrasi yang sering kali mencoba ulang untuk waktu yang lama saat pengujian gagal. Output
streaming t.Log
akan membantu Gophers men-debug kegagalan tes tersebut tanpa harus menunggu hingga waktu tes habis untuk menerima outputnya.