t.Log()
sẽ không hiển thị cho đến khi quá trình kiểm tra hoàn tất, vì vậy nếu bạn đang cố gắng gỡ lỗi một bài kiểm tra bị treo hoặc hoạt động kém thì có vẻ như bạn cần sử dụng fmt
.
Có: đó là trường hợp cho đến Go 1.13 (tháng 8 năm 2019).
Và điều đó được tiếp nối trong golang.org
số 24929
Hãy xem xét các thử nghiệm tự động (ngớ ngẩn) sau:
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)
}
}
Nếu tôi chạy go test -v
, tôi không nhận được đầu ra nhật ký nào cho đến khi tất cả TestFoo
được hoàn thành , sau đó không có đầu ra nào cho đến khi hoàn thành tất cả TestBar
và một lần nữa không có đầu ra nào nữa cho đến khi tất cả TestBaz
hoàn thành.
Điều này là tốt nếu các thử nghiệm đang hoạt động, nhưng nếu có một số loại lỗi, có một số trường hợp đầu ra nhật ký đệm có vấn đề:
- Khi lặp lại cục bộ, tôi muốn có thể thực hiện thay đổi, chạy thử nghiệm của mình, xem những gì đang xảy ra trong nhật ký ngay lập tức để hiểu điều gì đang xảy ra, nhấn CTRL + C để tắt thử nghiệm sớm nếu cần, thực hiện một thay đổi khác, tái chạy các bài kiểm tra, v.v.
Nếu TestFoo
chậm (ví dụ: đó là kiểm tra tích hợp), tôi không nhận được kết quả ghi nhật ký nào cho đến khi kết thúc kiểm tra. Điều này làm chậm đáng kể sự lặp lại.
- Nếu
TestFoo
có lỗi khiến nó bị treo và không bao giờ hoàn thành, tôi sẽ không nhận được bất kỳ đầu ra nhật ký nào. Trong những trường hợp này, t.Log
và t.Logf
không có ích gì cả.
Điều này làm cho việc gỡ lỗi rất khó khăn.
- Hơn nữa, tôi không chỉ không nhận được đầu ra nhật ký, mà nếu quá trình kiểm tra bị treo quá lâu, hoặc thời gian chờ kiểm tra Go sẽ giết kiểm tra sau 10 phút hoặc nếu tôi tăng thời gian chờ đó, nhiều máy chủ CI cũng sẽ ngừng kiểm tra nếu không có. ghi đầu ra sau một khoảng thời gian nhất định (ví dụ: 10 phút trong CircleCI).
Vì vậy, bây giờ các bài kiểm tra của tôi đã bị giết và tôi không có gì trong nhật ký để cho tôi biết điều gì đã xảy ra.
Nhưng đối với (có thể) Go 1.14 (Q1 2020): CL 127120
kiểm tra: đầu ra nhật ký phát trực tuyến ở chế độ tiết
Kết quả bây giờ là:
=== 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
Nó thực sự là trong Go 1.14, như Dave Cheney chứng thực trong " go test -v
đầu ra phát trực tuyến ":
Trong Go 1.14, go test -v
sẽ phát trực tiếp t.Log
đầu ra khi nó xảy ra, thay vì tích trữ nó cho đến khi kết thúc quá trình chạy thử nghiệm .
Trong Mục 1.14 fmt.Println
, t.Log
các dòng và và được xen kẽ , thay vì đợi quá trình kiểm tra hoàn thành, chứng tỏ rằng đầu ra kiểm tra được phát trực tuyến khi go test -v
được sử dụng.
Lợi thế, theo Dave:
Đây là một cải thiện chất lượng cuộc sống tuyệt vời cho các bài kiểm tra kiểu tích hợp thường thử lại trong thời gian dài khi bài kiểm tra không đạt.
Phát trực tuyến t.Log
đầu ra sẽ giúp Gophers gỡ lỗi các lỗi kiểm tra đó mà không cần phải đợi cho đến khi hết thời gian kiểm tra để nhận đầu ra của chúng.