Go テスト スイートで「os.Exit」の動作をテストするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-11 17:35:03
オリジナル
900 人が閲覧しました

How Do You Test `os.Exit` Behavior in Go Test Suites?

Go での os.Exit シナリオのテスト

os.Exit() を呼び出す Go 関数をテストする場合、これを防ぐために独自のアプローチが必要です。これらは、後続のテストへの干渉を防ぎます。

これに対処するには、次の点を考慮してください。コード:

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

Go Test を使用して os.Exit 動作を適切にテストする方法

この関数の終了動作をテストするには、次で概説されている手法を利用できます。アンドリュー・ジェランド氏、Goの中心メンバーチーム:

  1. テスト用に別のプロセスを作成:
    exec.Command を使用して別のプロセスで go test を再度呼び出します。実行を os.Exit をトリガーするテストに制限します。
  2. 環境変数を渡す:
    サブプロセスに環境変数 (例: BE_CRASHER=1) を設定します。テストされた関数は、この変数をチェックし、設定されている場合にのみ os.Exit を呼び出すことができます。
  3. 終了コードを検証する:
    サブプロセスが終了したら、元のテストで終了コードを検証します。プロセス。期待値 (例: 1) と一致する場合、テストは成功です。

テスト コード例:

package main

import (
    "fmt"
    "os"
    "os/exec"
    "testing"
)

func Crasher() {
    fmt.Println("Going down in flames!")
    os.Exit(1)
}

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 テスト スイートで os.Exit シナリオを効果的にテストできます。

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

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