Go での os.Exit シナリオのテスト
os.Exit() を使用してプログラムを終了する関数の呼び出しを含むテストを作成する場合、残りのテスト スイートへの影響を分離するために必要になります。この課題に対処するには、Go チームのコア メンバーである Andrew Gerand によるプレゼンテーションに触発された次のアプローチを活用できます。
os.Exit() を介してプログラムを終了する関数を指定すると、
package main import ( "fmt" "os" ) func Crasher() { fmt.Println("Going down in flames!") os.Exit(1) }
対応するテスト ケースを作成します:
package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { // Check if the BE_CRASHER environment variable is set to 1. if os.Getenv("BE_CRASHER") == "1" { Crasher() return } // Construct a command to re-run the test binary, limiting its execution to TestCrasher. cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") // Set additional environment variables. cmd.Env = append(os.Environ(), "BE_CRASHER=1") // Execute the command. err := cmd.Run() // Verify the exit status of the command. if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } // Report failure if the command ran with an unexpected exit code. t.Fatalf("process ran with err %v, want exit status 1", err) }
このテスト ケースは、別のプロセスで go test を再呼び出しし、TestCrasher の実行をスイートの残りの部分から分離します。また、呼び出されたプロセスがチェックする環境変数 (BE_CRASHER=1) も設定し、存在する場合はテスト対象の関数を呼び出します。したがって、無限ループを回避し、正しい終了コードが検証されるようにします。
以上がGo で os.Exit() を呼び出す関数をテストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。