testing.M 在 golang 中恢复

此恢复工作:


func TestSomeTest(t *testing.T) {

    defer func() {

        r := recover()

        fmt.Println("recovery")

        fmt.Println(r)

    }()

    panic("panic here")

}

但这不会:


func TestSomeTest(t *testing.T) {

    panic("panic here")

}


func TestMain(m *testing.M) {

    defer func() {

        r := recover()

        fmt.Println("recovery")

        fmt.Println(r)

    }()

    ret := m.Run()

    os.Exit(ret)

}

为什么?我希望这panic here将通过func TestMain(m *testing.M). 为什么不?在这种情况下,我panic没有任何recovery。


完整代码:


package main


import (

    "fmt"

    "os"

    "testing"

)


func TestSomeTest(t *testing.T) {

    // defer func() {

    //  r := recover()

    //  fmt.Println("recovery")

    //  fmt.Println(r)

    // }()

    panic("panic here")

}


func TestMain(m *testing.M) {

    defer func() {

        r := recover()

        fmt.Println("recovery")

        fmt.Println(r)

    }()

    ret := m.Run()

    os.Exit(ret)

}

要运行此代码,我使用了go test命令。


慕姐4208626
浏览 188回答 1
1回答

GCT1015

这是因为测试是在单独的 goroutine 中运行的。就像你的第一个例子发送了一个无法恢复的 goroutine。func TestSomeTest(t *testing.T) {    defer func() {        r := recover()        fmt.Println("recovery")        fmt.Println(r)    }()    go func() {        // won't recover        panic("panic here")    }()    time.Sleep(time.Second)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go