ホームページ > バックエンド開発 > Golang > `os.Exit()` を使用して Go コードの正確なテスト カバレッジを達成するにはどうすればよいですか?

`os.Exit()` を使用して Go コードの正確なテスト カバレッジを達成するにはどうすればよいですか?

DDD
リリース: 2024-12-23 14:39:22
オリジナル
327 人が閲覧しました

How Can I Achieve Accurate Test Coverage for Go Code Using `os.Exit()`?

カバレッジ情報を使用した Go での os.Exit シナリオのテスト (coveralls.io/Goveralls)

この質問は、OS が関係するテスト シナリオに関するものです。 Go の Exit()、特にこれらのシナリオのカバレッジ情報を取得する方法。提供されているサンプル コードは再実行メソッドを示していますが、カバレッジ ツールの制限と脆弱性があります。

カバレッジの課題

1 つの難点は、次のようなカバレッジ フレームワークが使用できないことです。 coveralls.io は、os.Exit() を呼び出すテストのカバレッジを記録しない場合があります。これは、テスト バイナリが再実行されるときにカバレッジ インストルメンテーションが適用されないためです。

修正された再実行メソッド

この問題に対処するには、修正された再実行メソッドが使用されます。 execメソッドを使用することができます。元のコードはリファクタリングされ、os.Exit を osExit という名前の変数として抽出します。次に、テスト コードは osExit を、終了コードを記録するモック関数に置き換えます。これにより、osExit 呼び出しのカバレッジ情報をキャプチャできるようになります。

外部呼び出しのカバレッジ

同じ手法を log.Fatalf() などの関数への呼び出しのカバーに適用できます。 、間接的に os.Exit を呼び出します。 logFatalf 関数は、メッセージ形式とそれに渡される引数を記録するモック関数に置き換えられます。これにより、os.Exit が外部関数から呼び出されるシナリオを確実にカバーできます。

変更されたコードとテストは次のとおりです。

// bar.go
package foo

import (
    "fmt"
    "os"
)

var osExit = os.Exit

func Crasher() {
    fmt.Println("Going down in flames!")
    osExit(1)
}
ログイン後にコピー
// bar_test.go
package foo

import (
    "reflect"
    "testing"
)

var logFatalf = log.Fatalf

func TestCrasher(t *testing.T) {
    // Save original functions and restore at the end
    oldOsExit := osExit
    oldLogFatalf := logFatalf
    defer func() {
        osExit = oldOsExit
        logFatalf = oldLogFatalf
    }()

    // Mock osExit
    var got int
    myExit := func(code int) {
        got = code
    }
    osExit = myExit

    // Mock logFatalf
    var gotFormat string
    var gotV []interface{}
    myFatalf := func(format string, v ...interface{}) {
        gotFormat, gotV = format, v
    }
    logFatalf = myFatalf

    // Run test
    Crasher()

    // Check results
    exp := 1
    if got != exp {
        t.Errorf("Expected exit code: %d, got: %d", exp, got)
    }

    expFormat, expV := "Exiting with code: %d", []interface{}{1}
    if gotFormat != expFormat || !reflect.DeepEqual(gotV, expV) {
        t.Error("Something went wrong")
    }
}
ログイン後にコピー

終了関連の機能を分離し、モック関数を使用することで、os.Exit と外部関数呼び出しの両方がトリガーされるようになります。 os.Exit は Go テストでカバーできます。このアプローチにより、プロセスの終了を伴うシナリオの正確なカバレッジ レポートが保証されます。

以上が`os.Exit()` を使用して Go コードの正確なテスト カバレッジを達成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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