ホームページ >バックエンド開発 >Golang >Go でパニックを効果的にテストするにはどうすればよいですか?

Go でパニックを効果的にテストするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 15:19:09486ブラウズ

How Can I Effectively Test for Panics in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。