在 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中文網其他相關文章!