Pregunta pruebas.M recuperarse en golang


Esta recuperación funciona:

func TestSomeTest(t *testing.T) {
    defer func() {
        r := recover()
        fmt.Println("recovery")
        fmt.Println(r)
    }()
    panic("panic here")
}

Pero esto no lo hace:

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)
}

¿Por qué? Eso espero panic here será recuperado por código en func TestMain(m *testing.M). Por qué no? Solo tengo panic sin ningún recovery en este caso.

Código completo:

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)
}

Para ejecutar este código utilicé. go test mando.


5
2018-04-15 14:08


origen


Respuestas:


Es porque las pruebas se ejecutan en goroutines separados.

Es como si tu primer ejemplo enviara una goroutina, que no se puede recuperar.

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)
}

6
2018-04-15 14:19



Preguntas populares