t.Log()
test tamamlanana kadar gösterilmeyecektir, bu nedenle asılı veya kötü performans gösteren bir testin hatalarını ayıklamaya çalışıyorsanız, kullanmanız gerekiyor gibi görünüyor fmt
.
Evet: Go 1.13'e (Ağustos 2019) kadar olan durum buydu.
Ve bu 24929 sayısında takip edildi.golang.org
Aşağıdaki (aptalca) otomatik testleri düşünün:
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)
}
}
Koşarsam go test -v
, ben her dek hiçbir ölçüm sonucu elde TestFoo
yapılır , tüm kadar o zaman hiçbir çıkış TestBar
yapılır ve tüm kadar yeniden artık çıkış TestBaz
yapılır.
Testler çalışıyorsa bu sorun değildir, ancak bir tür hata varsa, günlük çıktısının arabelleğe alınmasının sorunlu olduğu birkaç durum vardır:
- Yerel olarak yinelediğimde, bir değişiklik yapabilmek, testlerimi çalıştırabilmek, neler olup bittiğini anlamak için günlüklerde neler olduğunu hemen görebilmek, gerekirse testi erken kapatmak için CTRL + C'ye basmak, başka bir değişiklik yapmak, yeniden testleri çalıştırın vb.
Eğer TestFoo
(örneğin, bir entegrasyon testi var) yavaş, çok testin sonuna kadar hiçbir ölçüm sonucu olsun. Bu, yinelemeyi önemli ölçüde yavaşlatır.
TestFoo
Askıda kalmasına ve asla tamamlanmamasına neden olan bir hata varsa , hiçbir şekilde günlük çıktısı alamam. Bu durumlarda, t.Log
ve t.Logf
hiç bir faydası yoktur.
Bu, hata ayıklamayı çok zorlaştırır.
- Ayrıca, yalnızca günlük çıktısı almıyorum, aynı zamanda test çok uzun süre takılırsa, ya Go testi zaman aşımı 10 dakika sonra testi sonlandırır ya da bu zaman aşımını arttırırsam, birçok CI sunucusu da yoksa testleri sonlandırır. Belirli bir süre sonra günlük çıkışı (örneğin, CircleCI'de 10 dakika).
Şimdi testlerim öldü ve günlüklerde bana ne olduğunu anlatacak hiçbir şey yok.
Ancak (muhtemelen) Git 1.14 (Q1 2020) için: CL 127120
test etme: ayrıntılı modda akış günlüğü çıktısı
Şimdi çıktı:
=== 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
Dave Cheney'in " go test -v
akış çıkışı " nda da onayladığı gibi, gerçekten Go 1.14'te :
Go 1.14'te, çıktıyı test çalıştırmasının sonuna kadar biriktirmek yerine , go test -v
gerçekleştiği anda akışla alacaktır .t.Log
Go 1.14 altında fmt.Println
ve t.Log
çizgiler vardır araya ilave ziyade zaman akış olduğunu test çıkış gösteren, tam için test için beklemek yerine, go test -v
kullanılır.
Dave'e göre avantaj:
Bu, test başarısız olduğunda genellikle uzun süreler boyunca yeniden denenen entegrasyon stili testler için büyük bir yaşam kalitesi iyileştirmesidir.
Akış t.Log
çıkışı, Gophers'ın çıktılarını almak için tüm testin zaman aşımına uğramasını beklemek zorunda kalmadan bu test hatalarını gidermesine yardımcı olur.