堅牢なソフトウェア開発には、さまざまなテスト シナリオをカバーすることが重要です。 Go では、os.Exit を呼び出す関数のテストに特有の課題が生じます。テスト スイート全体に干渉せずに終了シナリオをテストするにはどうすればよいでしょうか?
次の関数を考えてみましょう。これは運命的です:
func doomed() { os.Exit(1) }
この関数の呼び出しが終了をトリガーすることを効果的にテストするには、次のようにします。 os.Exit 呼び出しをテスト内に限定し、他のテストへの影響を防ぐ戦略を採用する必要があります。
Go チームの中心メンバーである Andrew Gerand 氏、氏はプレゼンテーションの中で、この問題に対する独創的なアプローチを提供しています。このソリューションを実装しましょう:
main.go (テスト対象の関数を含むプログラム)
package main import ( "fmt" "os" ) func Crasher() { fmt.Println("Going down in flames!") os.Exit(1) }
main_test.go (クラッシャー関数のテスト)
package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { // Check if "BE_CRASHER" environment variable is set. if os.Getenv("BE_CRASHER") == "1" { Crasher() return } // Invoke the test again with "BE_CRASHER=1" to trigger the Crasher call. cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") cmd.Env = append(os.Environ(), "BE_CRASHER=1") err := cmd.Run() // Validate exit code. if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } t.Fatalf("process ran with err %v, want exit status 1", err) }
実行:
このソリューションは次のように機能します:
このアプローチを使用すると、Go での終了シナリオを中断することなく自信を持ってテストできます。テストスイートの残りの部分。
以上がテストスイートを中断せずに Go で「os.Exit」シナリオをテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。