如何在Go中测试os.export场景?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (64)

给定这个代码

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

如何正确测试调用此函数将导致使用go test是吗?这需要在一组测试中发生,换句话说,os.Exit()调用不能影响其他测试。

提问于
用户回答回答于

我不认为你能测试os.Exit不需要从外部模拟测试(使用exec.Command)过程。

也就是说,你也许可以通过创建接口或函数类型然后在测试中使用noop实现:

Go Playground

package main

import "os"
import "fmt"

type exiter func (code int)

func main() {
    doExit(func(code int){})
    fmt.Println("got here")
    doExit(func(code int){ os.Exit(code)})
}

func doExit(exit exiter) {
    exit(1)
}
用户回答回答于

给定一个函数(在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)
}

代码所做的是调用go test在一个单独的过程中exec.Command,将执行限制在TestCrasher测试(通过-test.run=TestCrasher开关)。它还通过一个环境变量传递一个标志(BE_CRASHER=1),第二次调用检查,则调用被测试的系统,然后立即返回,以防止陷入无限循环。

扫码关注云+社区

领取腾讯云代金券