私は現在、特定のコードがパニックになったかどうかをチェックするテストをどのように書くべきか考えています。Goではrecover
パニックをキャッチするために、Java コードとは異なり、パニックが発生した場合にどのコードをスキップするかを実際に指定することはできません。そのため、次のような関数があるとします。
func f(t *testing.T) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
OtherFunctionThatPanics()
t.Errorf("The code did not panic")
}
パニックが発生して回復したのか、それとも関数がパニックにならなかったのか、よくわかりませんOtherFunctionThatPanics
。パニックが発生しなかった場合にスキップするコードと、パニックが発生した場合に実行するコードをどのように指定すればよいでしょうか。パニックから回復したかどうかをどのように確認すればよいでしょうか。
ベストアンサー1
testing
実際には「成功」という概念はなく、失敗だけがあります。したがって、上記のコードはほぼ正しいです。このスタイルの方が少しわかりやすいかもしれませんが、基本的には同じことです。
func TestPanic(t *testing.T) {
defer func() {
if r := recover(); r == nil {
t.Errorf("The code did not panic")
}
}()
// The following is the code under test
OtherFunctionThatPanics()
}
一般的にはかなり弱いと思いますtesting
。より強力なテストエンジンに興味があるかもしれません。銀杏完全なGinkgoシステムが必要ない場合でも、マッチャーライブラリだけを使用することもできます。ゴメガは と一緒に使用できますtesting
。Gomega には次のようなマッチャーが含まれています。
Expect(OtherFunctionThatPanics).To(Panic())
パニックチェックを単純な関数にまとめることもできます。
func TestPanic(t *testing.T) {
assertPanic(t, OtherFunctionThatPanics)
}
func assertPanic(t *testing.T, f func()) {
defer func() {
if r := recover(); r == nil {
t.Errorf("The code did not panic")
}
}()
f()
}