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

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

Susan Sarandon
リリース: 2024-12-05 15:19:09
オリジナル
445 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート