ホームページ  >  記事  >  バックエンド開発  >  Go で os.Exit() を呼び出す関数をテストする方法

Go で os.Exit() を呼び出す関数をテストする方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-18 01:41:02495ブラウズ

How to Test Functions That Call os.Exit() in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。