ホームページ  >  記事  >  バックエンド開発  >  テストスイートをクラッシュさせずに Go で「os.Exit」シナリオをテストする方法

テストスイートをクラッシュさせずに Go で「os.Exit」シナリオをテストする方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-13 12:17:02576ブラウズ

 How to Test `os.Exit` Scenarios in Go Without Crashing Your Test Suite?

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

Go では、os.Exit 関数はプログラムの実行を停止し、オペレーティング システムを終了します。しかし、他のテストに影響を与えずに、テスト スイート内で os.Exit を含むシナリオをテストするにはどうすればよいでしょうか?

次のコードを考えてみましょう:

func doomed() {
  os.Exit(1)
}

出口での呼び出しが運命的な結果になることをテストするには、次のようにします。テスト ランナーも終了してしまうため、単純にテスト内で呼び出すことはできません。代わりに、Andrew Gerand が実証したアプローチを見てみましょう。

Gerrand の方法では、別のプロセスでテストを実行します。これにより、os.Exit 呼び出しを別のプロセス内にカプセル化し、メインのテスト ランナーに影響を与えないようにすることができます。

その仕組みは次のとおりです。

// main_test.go
package main

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

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 を呼び出します。 TestCrasher テストのみを対象として、別のプロセスで再度テストします。サブプロセスがチェックする環境変数 (BE_CRASHER) を設定します。設定されている場合、サブプロセスはクラッシャーを呼び出し、無限再帰を避けるためにすぐに終了します。

一方、元のテスト プロセスはサブプロセスの終了コードを検証し、期待どおりに終了することを確認できます。

以上がテストスイートをクラッシュさせずに Go で「os.Exit」シナリオをテストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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