ホームページ > バックエンド開発 > Golang > Golang 関数テストにおけるエラー処理戦略

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

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

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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. カスタム エラー タイプ

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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 アサーションが用意されています。エラー状態を確認するのに役立ちます。これらは、エラー チェック コードを記述するための簡潔な方法を提供します。

1

2

3

4

5

6

7

8

9

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 関数を提供します。

1

2

3

4

5

6

7

func TestDivide(t *testing.T) {

    result, err := Divide(10, 0)

    if err != nil {

        t.Fatal(err)

    }

    fmt.Println(result) // 输出:0 (不会执行)

}

ログイン後にコピー

実際的なケース

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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

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