Go でのパニックのテスト
Go でテストを作成する場合、パニックをチェックすることは有用なテクニックとなります。ただし、Java とは異なり、Go にはパニックを選択的に処理するための明示的な構文がありません。
次の例を考えてみましょう:
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") }
このコードは、recover 関数を使用して OtherFunctionThatPanics のパニックから回復しようとします。 。ただし、関数がまったくパニックになったかどうか、それともパニックが発生しなかったのかを判断するのは難しい場合があります。
解決策
推奨されるアプローチは、不在のテストに重点を置くことです。パニック状態の。これは、ロジックを反転し、予想された場合にパニックが発生することを確認することで実現できます。
func TestPanic(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() // Code under test OtherFunctionThatPanics() }
さらに、Ginkgo や Gomega などのより高度なテスト フレームワークには、パニックの発生をアサートするための組み込みマッチャーが用意されています。
Expect(OtherFunctionThatPanics).To(Panic())
ユーティリティ関数
便宜上、パニックをアサートするための汎用関数を作成できます:
func assertPanic(t *testing.T, f func()) { defer func() { if r := recover(); r == nil { t.Errorf("The code did not panic") } }() f() }
この関数は次のように使用できます:
func TestPanic(t *testing.T) { assertPanic(t, OtherFunctionThatPanics) }
以上がGo でパニックを効果的にテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。