testing - 如何在 Go 中测试 os.exit 场景

标签 testing go exit-code

鉴于此代码

func doomed() {
  os.Exit(1)
}

如何正确测试调用此函数是否会导致使用 go test 退出?这需要在一组测试中发生,换句话说,os.Exit() 调用不会影响其他测试,应该被捕获。

最佳答案

有一个 presentation由 Andrew Gerrand(Go 团队的核心成员之一)在其中展示了如何做到这一点。

给定一个函数(在 main.go 中)

package main

import (
    "fmt"
    "os"
)

func Crasher() {
    fmt.Println("Going down in flames!")
    os.Exit(1)
}

下面是测试它的方法(通过 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)
}

代码所做的是通过 exec.Command 在单独的进程中再次调用 go test,将执行限制为 TestCrasher 测试(通过-test.run=TestCrasher 开关)。它还通过第二次调用检查的环境变量 (BE_CRASHER=1) 传入一个标志,如果设置,则调用被测系统,然后立即返回以防止陷入无限状态环形。因此,我们被退回到原来的调用站点,现在可以验证实际的退出代码。

来源:Slide 23安德鲁的演讲。第二张幻灯片包含指向 presentation's video 的链接。也是。 他在 47:09 谈论子流程测试。

关于testing - 如何在 Go 中测试 os.exit 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26225513/

相关文章:

linux - 即使提取成功,解压缩也会返回退出代码 1

java - 使用内存数据库为 Rest Controller 编写测试

maven - 使用 Monocle 在 headless (headless) CI 环境上运行 JavaFx 测试失败

selenium - 如何在 Qmetry 自动化框架(QAF)中放置检查点

java - javaws 退出代码真的坏了吗?

如果在没有 shell 的情况下运行,Ruby 将以退出代码 1 响应 TERM 退出

c# - 如何使用内部构造函数模拟事件

csv - 从 main 访问内部作用域中的结构数据并保存到 Golang 中的 csv

ssl - Golang ListenAndServeTLS 不会接受我的证书

go - 如何分配常驻内存?