Golang-ユニットテストにおける正しい後処理の書き方:t.Cleanup()
ユニットテストの後処理を行う場合、
defer
は並列で動いているサブテストの終了を待たずに実行されてしまう問題がある。
全てのサブテストが終了してから後処理を行たいなら t.Cleanup()
を使おう。
Defer
による後処理の例
package main
import (
"log"
"testing"
)
func TestDefer(t *testing.T) {
tcs := map[string]string{
"A": "1",
"B": "2",
"C": "3",
}
defer log.Printf("End")
for tn, tc := range tcs {
tc := tc
t.Run(tn, func(t *testing.T) {
t.Parallel()
log.Println(tc)
})
}
}
そのログの抜粋:
2009/11/10 23:00:00 End
2009/11/10 23:00:00 1
2009/11/10 23:00:00 3
2009/11/10 23:00:00 2
t.Cleanup()
による後処理
package main
import (
"log"
"testing"
)
func TestCleanup(t *testing.T) {
tcs := map[string]string{
"A": "1",
"B": "2",
"C": "3",
}
t.Cleanup(func() {
log.Printf("End")
})
for tn, tc := range tcs {
tc := tc
t.Run(tn, func(t *testing.T) {
t.Parallel()
log.Println(tc)
})
}
}
そのログの抜粋:
2009/11/10 23:00:00 1
2009/11/10 23:00:00 3
2009/11/10 23:00:00 2
2009/11/10 23:00:00 End