在 Go 中测试 os.Exit 场景
在编写涉及使用 os.Exit() 调用退出程序的函数的测试时,它有必要隔离它们对测试套件其余部分的影响。为了应对这一挑战,我们可以利用以下受 Go 团队核心成员 Andrew Gerrand 演讲启发的方法。
给定一个通过 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中文网其他相关文章!