ホームページ > バックエンド開発 > Golang > log.Fatal() を使用する Go 関数を効果的にテストするにはどうすればよいですか?

log.Fatal() を使用する Go 関数を効果的にテストするにはどうすればよいですか?

DDD
リリース: 2024-12-10 14:47:12
オリジナル
138 人が閲覧しました

How Can I Effectively Test Go Functions That Use log.Fatal()?

log.Fatal() を使用した Go 関数のテスト

Go アプリケーションでは、重大なエラーを記録するために log.Fatal() を使用するのが一般的です。そしてすぐにプログラムを終了します。この動作は実稼働環境では便利ですが、テスト時には課題が生じます。この課題を克服する方法は次のとおりです。

テスト用のカスタム ロガー

1 つのアプローチは、ログ メッセージを事前定義されたバッファにリダイレクトするカスタム ロガーを実装することです。これにより、log.Fatal() によってプログラムが終了することなく、ロギング機能をテストできます。

// logger.go contains a testing logger that implements *log.Logger
type TestingLogger struct {
    b bytes.Buffer
}

// Println implements log.Print methods, writing to a buffer instead of stdout.
func (l *TestingLogger) Println(args ...interface{}) {
    l.b.WriteString(fmt.Sprintln(args...))
}

// String returns the buffered log messages.
func (l *TestingLogger) String() string {
    return l.b.String()
}
ログイン後にコピー

テスト例

カスタム ロガーを配置すると、次のようにログ機能のテストを続行できます。

package main

import (
    "bytes"
    "log"
    "testing"
)

// Set up the custom logger for testing.
var logger = &logger.TestingLogger{}

func init() {
    log.SetOutput(logger)
}

func TestGoodbye(t *testing.T) {
    // Call the function to be tested.
    log.Fatal("Goodbye!")

    // Verify the expected log message was written to the buffer.
    wantMsg := "Goodbye!\n"
    if logger.String() != wantMsg {
        t.Errorf("Expected: %s, Got: %s", wantMsg, logger.String())
    }
}
ログイン後にコピー

ログ機能をプログラムの終了と分離することで、バッファ内のログ メッセージをキャプチャすると、テストを失敗させることなく、log.Fatal() を使用するコードを効果的にテストできます。

以上がlog.Fatal() を使用する Go 関数を効果的にテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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