testing.Mが追加されテスト実行前後に何かを書けるようになった

例えば

// main_test.go

var exitCode = 0

func TestMain(m *testing.M) {
    defer os.Exit(exitCode)

    beforeAll()
    defer afterAll()

    exitCode = m.Run()
}

func beforeAll() {}
func afterAll() {}

みたいにして、mainパッケージのようにテスト実行の前後に適当処理入れたりとかが出来るようになった(1.4rc2から)。 mysqldとかテストの間ずーっと立ちあげといて最後に止めたいもの(テスト毎やるとコストがかかるもの)があったりすると重宝すると思う。


以前からそういう願望があった。

たしか1.3かその直前ぐらいだったと思うけど、なんとかできないかなと思ってそのへんのコード読んでいると「TestGoFilesのASTを順番見てってfunc Test*(*testing.T) をひろってテンプレートに渡して、それを実行する。」な風になっていてそれを利用してこういうことをしていた。

testing.Mainも自由にやりたい、もしくはtesting.after書きかえたい
testing.afterを自由にしたかった。テストの最後になんかしたかった。golang - コンドルが飛んでいる。 2014/01/14

久々にGo書いていて、ふと他にやり方ないかもう一回見とこうと cmd/go/test.go とか testing あたりを見ていたら、testing.M とか TestMain(*testing.M) とかってのがあって、どうやらこれは目的のものだってことで喜んでいた。

net/httpz_last_test.go もこれを使った形に書き直されている。 net/http: replace z_last_test hack with testing.Main · 93e5cc2 · golang/go · GitHub