覆蓋各種測試場景對於健壯的軟體開發至關重要。在 Go 中,測試呼叫 os.Exit 的函數提出了獨特的挑戰。我們如何在不干擾整個測試套件的情況下測試退出場景?
考慮以下函數,注定會失敗:
func doomed() { os.Exit(1) }
為了有效測試呼叫此函數是否會觸發退出,您將需要採用一種策略,將os.Exit 呼叫限制在測試中,並防止其影響其他測試。
Go 團隊的核心成員 Andrew Gerrand,在他的演講中提供了解決這個問題的巧妙方法。讓我們實作這個解決方案:
main.go(要測試功能的程式)
package main import ( "fmt" "os" ) func Crasher() { fmt.Println("Going down in flames!") os.Exit(1) }
main_test.go(測試 Crasher 功能)
package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { // Check if "BE_CRASHER" environment variable is set. if os.Getenv("BE_CRASHER") == "1" { Crasher() return } // Invoke the test again with "BE_CRASHER=1" to trigger the Crasher call. cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") cmd.Env = append(os.Environ(), "BE_CRASHER=1") err := cmd.Run() // Validate exit code. if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } t.Fatalf("process ran with err %v, want exit status 1", err) }
執行:
此解決方案的工作原理是:
使用這種方法,您可以自信地在 Go 中測試退出場景,而不會中斷測試套件的其餘部分。
以上是如何在不中斷測試套件的情況下測試 Go 中的「os.Exit」場景?的詳細內容。更多資訊請關注PHP中文網其他相關文章!