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