Golang 関数テストにおけるエラー処理戦略

WBOY
リリース: 2024-04-16 16:54:01
オリジナル
688 人が閲覧しました

Go 関数テストにおけるエラー処理戦略には、組み込みエラー パッケージを使用してエラーを作成および管理することが含まれます。エラー タイプをカスタマイズして、より具体的なエラー情報を提供します。アサート アサーションを使用してエラー状態を簡潔にチェックします。 Fatal と Skip を使用して、重大なエラーのテストを終了またはスキップします。

Golang 函数测试中的错误处理策略

Go 関数テストにおけるエラー処理戦略

Go 関数テストでは、エラーを正しく処理することが信頼性を確保するために不可欠です。テストと堅牢性が重要です。いくつかの実践的な戦略を次に示します。

1. 組み込みの errors パッケージを使用します。

Go の標準ライブラリには errors が用意されています。エラーを作成および管理するためのメカニズムを提供するパッケージ。エラー値は error インターフェイスを実装できるため、if 条件を簡単に使用してエラーを処理できます。

import (
    "fmt"
    "errors"
)

func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

func TestDivide(t *testing.T) {
    result, err := Divide(10, 2)
    if err != nil {
        t.Error(err)
    }
    fmt.Println(result) // 输出:5
}
ログイン後にコピー

2. カスタム エラー タイプ

場合によっては、組み込みエラーの代わりにカスタム エラー タイプを使用する方が適切です。これにより、より具体的で意味のあるエラー情報が提供されます。

type MyError struct {
    Message string
}

func (e MyError) Error() string {
    return e.Message
}

func SomeFunction() error {
    return MyError{Message: "an error occurred"}
}

func TestSomeFunction(t *testing.T) {
    err := SomeFunction()
    if err != nil {
        t.Errorf("an error occurred: %v", err)
    }
}
ログイン後にコピー

3. assert アサーションを使用します。

Go の testing パッケージには assert アサーションが用意されています。エラー状態を確認するのに役立ちます。これらは、エラー チェック コードを記述するための簡潔な方法を提供します。

import "testing"

func TestDivide(t *testing.T) {
    result, err := Divide(10, 2)
    if err := assert.NoError(err); err != nil {
        t.Error(err)
    }
    fmt.Println(result) // 输出:5
}
ログイン後にコピー

4. FatalSkip

重大なエラーが発生した場合、場合によっては、テストを終了する必要があります。 testing パッケージは、この目的のために Fatal および Skip 関数を提供します。

func TestDivide(t *testing.T) {
    result, err := Divide(10, 0)
    if err != nil {
        t.Fatal(err)
    }
    fmt.Println(result) // 输出:0 (不会执行)
}
ログイン後にコピー

実際的なケース

エラーを処理する必要がある関数テストの例を考えてみましょう:

import (
    "testing"
    "errors"
)

func MyFunction(input string) (string, error) {
    if input == "" {
        return "", errors.New("input cannot be empty")
    }
    return input + " processed", nil
}

func TestMyFunction(t *testing.T) {
    testCases := []struct {
        input    string
        expected string
        err      error
    }{
        {input: "abc", expected: "abc processed", err: nil},
        {input: "", expected: "", err: errors.New("input cannot be empty")},
    }

    for _, tc := range testCases {
        result, err := MyFunction(tc.input)
        if !errors.Is(err, tc.err) {
            t.Errorf("expected error %v, got %v", tc.err, err)
        }
        if result != tc.expected {
            t.Errorf("expected %v, got %v", tc.expected, result)
        }
    }
}
ログイン後にコピー

この例では # を使用します。 # #testCases さまざまな入力シナリオをカバーするテーブル駆動のテスト。 errors.Is を使用して、実際のエラーと予想されるエラーを比較します。ここでも、if 条件を使用してエラーを処理し、結果が期待どおりであることを確認します。

以上がGolang 関数テストにおけるエラー処理戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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