テストスイートを中断せずに Go で「os.Exit」シナリオをテストするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-12 17:08:02
オリジナル
676 人が閲覧しました

How to Test `os.Exit` Scenarios in Go Without Disrupting the Test Suite?

Go での単体テスト終了シナリオ

堅牢なソフトウェア開発には、さまざまなテスト シナリオをカバーすることが重要です。 Go では、os.Exit を呼び出す関数のテストに特有の課題が生じます。テスト スイート全体に干渉せずに終了シナリオをテストするにはどうすればよいでしょうか?

次の関数を考えてみましょう。これは運命的です:

func doomed() {
  os.Exit(1)
}
ログイン後にコピー

この関数の呼び出しが終了をトリガーすることを効果的にテストするには、次のようにします。 os.Exit 呼び出しをテスト内に限定し、他のテストへの影響を防ぐ戦略を採用する必要があります。

Testing 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)
}
ログイン後にコピー

実行:

このソリューションは次のように機能します:

  • exec を介して別のプロセスで go test を再度呼び出します。コマンド。実行を TestCrasher テストに制限します。
  • 環境変数 (BE_CRASHER=1) を介してフラグを渡し、2 番目の呼び出しの動作を制御します。
  • フラグを確認し、設定されている場合はフラグを確認します。
  • 終了コードを検証して、テストが期待どおりに合格したことを確認します。

このアプローチを使用すると、Go での終了シナリオを中断することなく自信を持ってテストできます。テストスイートの残りの部分。

以上がテストスイートを中断せずに Go で「os.Exit」シナリオをテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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