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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-09 10:59:11868ブラウズ

How to Effectively Test Go Functions Using `log.Fatal()`?

log.Fatal() を含む Go 関数のテスト

log.Fatal() を利用して出力する Go 関数があるシナリオを考えてみましょう。メッセージ。このような関数のテストは、log.Fatal() が os.Exit(1) をトリガーしてテスト失敗を引き起こすため、困難な場合があります。

アプローチ:

この課題を克服するには、出力を標準の log.xxx() 宛先にリダイレクトするカスタム ロガーを実装することをお勧めします。ただし、テスト中に、log.Fatalf() などの関数を、os.Exit(1) を呼び出さない独自の実装と簡単に交換できます。

例:

ログを出力する次のコードがあるとします。

package main

import (
    "log"
)

func hello() {
    log.Print("Hello!")
}

func goodbye() {
    log.Fatal("Goodbye!")
}

func init() {
    log.SetFlags(0)
}

func main() {
    hello()
    goodbye()
}

このコードをテストするには、次のようにします。仮説テストを定式化できます:

package main

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


func TestHello(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)

    hello()

    wantMsg := "Hello!\n"
    msg := buf.String()
    if msg != wantMsg {
        t.Errorf("%#v, wanted %#v", msg, wantMsg)
    }
}

func TestGoodby(t *testing.T) {
    var buf bytes.Buffer
    log.SetOutput(&buf)

    goodbye()

    wantMsg := "Goodbye!\n"
    msg := buf.String()
    if msg != wantMsg {
        t.Errorf("%#v, wanted %#v", msg, wantMsg)
    }
}

注:

このアプローチにより、テスト中に特定のロガー関数を柔軟に置き換えることができ、ロガーの機能に影響を与えることなく動作をカスタマイズできます。オリジナル機能はテスト中です。

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

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