Go での os.exit シナリオのテスト
Go では、os.Exit 関数はプログラムの実行を停止し、オペレーティング システムを終了します。しかし、他のテストに影響を与えずに、テスト スイート内で os.Exit を含むシナリオをテストするにはどうすればよいでしょうか?
次のコードを考えてみましょう:
func doomed() { os.Exit(1) }
出口での呼び出しが運命的な結果になることをテストするには、次のようにします。テスト ランナーも終了してしまうため、単純にテスト内で呼び出すことはできません。代わりに、Andrew Gerand が実証したアプローチを見てみましょう。
Gerrand の方法では、別のプロセスでテストを実行します。これにより、os.Exit 呼び出しを別のプロセス内にカプセル化し、メインのテスト ランナーに影響を与えないようにすることができます。
その仕組みは次のとおりです。
// main_test.go package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { if os.Getenv("BE_CRASHER") == "1" { Crasher() return } cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") cmd.Env = append(os.Environ(), "BE_CRASHER=1") err := cmd.Run() if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } t.Fatalf("process ran with err %v, want exit status 1", err) }
このテストは go を呼び出します。 TestCrasher テストのみを対象として、別のプロセスで再度テストします。サブプロセスがチェックする環境変数 (BE_CRASHER) を設定します。設定されている場合、サブプロセスはクラッシャーを呼び出し、無限再帰を避けるためにすぐに終了します。
一方、元のテスト プロセスはサブプロセスの終了コードを検証し、期待どおりに終了することを確認できます。
以上がテストスイートをクラッシュさせずに Go で「os.Exit」シナリオをテストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。