2015-04-15 10 views
5

Diese Erholung funktioniert:testing.M erholen in golang

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

Aber dies nicht:

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

Warum? Ich erwarte, dass panic here durch Code in func TestMain(m *testing.M) wiederhergestellt wird. Warum nicht? Ich habe nur panic ohne recovery in diesem Fall.

Voll Code:

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

diesen Code auszuführen verwendete ich go test Befehl.

Antwort

6

Das liegt daran, dass die Tests in separaten Gruoutinen ausgeführt werden.

Es ist wie wenn dein erstes Beispiel eine Goroutine abschickt, die nicht wiederhergestellt werden kann.

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