t.Log()
테스트가 완료 될 때까지 표시되지 않으므로 중단되거나 성능이 나쁜 테스트를 디버깅하려는 경우을 사용해야 fmt
합니다.
예 : Go 1.13 (2019 년 8 월)까지 포함되었습니다.
그리고 그것은 golang.org
24929 호에서 뒤따 랐습니다.
다음 (어리석은) 자동 테스트를 고려하십시오.
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)
}
}
내가 실행하면 go test -v
, 내가 모든 때까지 더 로그 출력을 얻을 TestFoo
완료 , 모든 때까지 출력이 TestBar
수행되지 않으며, 모든 때까지 다시 한번 더 출력이 TestBaz
이루어집니다.
테스트가 작동하면 괜찮지 만 버그가있는 경우 버퍼링 로그 출력에 문제가있는 몇 가지 경우가 있습니다.
- 로컬에서 반복 할 때 변경을 수행하고 테스트를 실행하고 로그에서 무슨 일이 일어나고 있는지 즉시 확인하고 필요한 경우 CTRL + C를 눌러 테스트를 일찍 종료하고 다른 변경을 수행하고 다시 수행 할 수 있기를 원합니다. 테스트를 실행합니다. 느린
경우 TestFoo
(예 : 통합 테스트) 테스트가 끝날 때까지 로그 출력이 표시되지 않습니다. 이것은 반복을 상당히 느리게합니다.
- 경우
TestFoo
는 걸 결코 완전한 일으키는 버그를 가지고, 난 더 로그 출력 무엇이든지를 얻을 것입니다. 이 경우 t.Log
와 t.Logf
전혀 쓸모가 있습니다.
이것은 디버깅을 매우 어렵게 만듭니다.
- 또한 로그 출력이 표시되지 않을뿐만 아니라 테스트가 너무 오래 중단되면 Go 테스트 시간 제한이 10 분 후에 테스트를 종료하거나 해당 시간 제한을 늘리면 많은 CI 서버가 테스트를 종료합니다. 일정 시간 (예 : CircleCI에서 10 분) 후 출력을 기록합니다.
이제 내 테스트가 종료되고 로그에 무슨 일이 일어 났는지 알려주는 내용이 없습니다.
그러나 (아마도) Go 1.14 (2020 년 1 분기) : CL 127120
테스트 : 상세 모드에서 로그 출력 스트림
이제 출력은 다음과 같습니다.
=== 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가 " go test -v
스트리밍 출력 " 에서 증명했듯이 실제로 Go 1.14에 있습니다 .
Go 1.14에서는 테스트 실행이 끝날 때까지 저장하지 않고 발생하는대로 출력 을go test -v
스트리밍 합니다 .t.Log
Go 1.14에서는 테스트가 완료 될 때까지 기다리지 않고 fmt.Println
및 t.Log
행이 인터리브되어 사용시 테스트 출력이 스트리밍됨을 보여줍니다 go test -v
.
Dave에 따르면 이점 :
이것은 테스트가 실패 할 때 종종 오랜 기간 동안 재 시도하는 통합 스타일 테스트를위한 훌륭한 삶의 질 향상입니다.
스트리밍t.Log
출력은 Gophers가 출력을 받기 위해 전체 테스트 시간이 초과 될 때까지 기다릴 필요없이 테스트 실패를 디버깅하는 데 도움이됩니다.