カバレッジ情報を使用した 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 サイトの他の関連記事を参照してください。