mirror of
https://github.com/golang/go
synced 2024-11-21 21:04:41 -07:00
testing: let runtime catch the panic.
It's not as pretty, but it deletes some irrelevant information from the printout and avoids a dependency. It also means the test binary will stop if a test panics. That's a feature, not a bug. Any output printed by the test appears before the panic traceback. before: --- FAIL: TestPanic (0.00 seconds) fmt_test.go:19: HI testing.go:257: runtime error: index out of range /Users/r/go/src/pkg/testing/testing.go:257 (0x23998) _func_003: t.Logf("%s\n%s", err, debug.Stack()) /Users/r/go/src/pkg/runtime/proc.c:1388 (0x10d2d) panic: reflect·call(d->fn, d->args, d->siz); /Users/r/go/src/pkg/runtime/runtime.c:128 (0x119b0) panicstring: runtime·panic(err); /Users/r/go/src/pkg/runtime/runtime.c:85 (0x11857) panicindex: runtime·panicstring("index out of range"); /Users/r/go/src/pkg/fmt/fmt_test.go:21 (0x23d72) TestPanic: a[10]=1 /Users/r/go/src/pkg/testing/testing.go:264 (0x21b75) tRunner: test.F(t) /Users/r/go/src/pkg/runtime/proc.c:258 (0xee9e) goexit: runtime·goexit(void) FAIL after: --- FAIL: TestPanic (0.00 seconds) fmt_test.go:19: HI panic: runtime error: index out of range [recovered] panic: (*testing.T) (0xec3b0,0xf8400001c0) goroutine 2 [running]: testing._func_003(0x21f5fa8, 0x21f5100, 0x21f5fb8, 0x21f5e88) /Users/r/go/src/pkg/testing/testing.go:259 +0x108 ----- stack segment boundary ----- fmt_test.TestPanic(0xf8400001c0, 0x27603728) /Users/r/go/src/pkg/fmt/fmt_test.go:21 +0x6b testing.tRunner(0xf8400001c0, 0x18edb8, 0x0, 0x0) /Users/r/go/src/pkg/testing/testing.go:264 +0x6f created by testing.RunTests /Users/r/go/src/pkg/testing/testing.go:343 +0x76e goroutine 1 [chan receive]: testing.RunTests(0x2000, 0x18edb8, 0x2400000024, 0x100000001, 0x200000001, ...) /Users/r/go/src/pkg/testing/testing.go:344 +0x791 testing.Main(0x2000, 0x18edb8, 0x2400000024, 0x188a58, 0x800000008, ...) /Users/r/go/src/pkg/testing/testing.go:275 +0x62 main.main() /var/folders/++/+++Fn+++6+0++4RjPqRgNE++2Qk/-Tmp-/go-build743922747/fmt/_test/_testmain.go:129 +0x91 exit status 2 R=rsc, dsymonds CC=golang-dev https://golang.org/cl/5658048
This commit is contained in:
parent
5ab935f68a
commit
bf2838334c
@ -2,7 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package debug_test
|
package debug
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "runtime/debug"
|
. "runtime/debug"
|
||||||
|
@ -71,7 +71,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"runtime/debug"
|
|
||||||
"runtime/pprof"
|
"runtime/pprof"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@ -248,13 +247,12 @@ func tRunner(t *T, test *InternalTest) {
|
|||||||
// a call to runtime.Goexit, record the duration and send
|
// a call to runtime.Goexit, record the duration and send
|
||||||
// a signal saying that the test is done.
|
// a signal saying that the test is done.
|
||||||
defer func() {
|
defer func() {
|
||||||
// Log and recover from panic instead of aborting binary.
|
|
||||||
if err := recover(); err != nil {
|
|
||||||
t.failed = true
|
|
||||||
t.Logf("%s\n%s", err, debug.Stack())
|
|
||||||
}
|
|
||||||
|
|
||||||
t.duration = time.Now().Sub(t.start)
|
t.duration = time.Now().Sub(t.start)
|
||||||
|
// If the test panicked, print any test output before dying.
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
t.report()
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
t.signal <- t
|
t.signal <- t
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user