覆盖各种测试场景对于健壮的软件开发至关重要。在 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中文网其他相关文章!