首頁  >  文章  >  後端開發  >  如何在 Go 中測試 `os.Exit` 場景而不導致測試套件崩潰?

如何在 Go 中測試 `os.Exit` 場景而不導致測試套件崩潰?

Patricia Arquette
Patricia Arquette原創
2024-11-13 12:17:02585瀏覽

 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 Gerrand 演示的方法。

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)。如果設置,子程序會呼叫 Crasher 並立即退出,以避免無限遞歸。

同時,原始測試程序可以驗證子程序的退出代碼,確保其如預期終止。

以上是如何在 Go 中測試 `os.Exit` 場景而不導致測試套件崩潰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn