猿问

GO 在测试设置方法中附加标准输入

我正在使用内置testing模块来运行我在 GO 项目中进行的一些功能测试。在我的项目中,我有外部依赖项,我在我的TestMain方法中连接到这些依赖项。我将这些连接保存到变量中,然后我在测试中使用这些变量,并且连接可能需要很长时间才能正确建立(Kafka 有人吗?)。我想按需运行测试,但是在设置了这些变量之后。


stdin所以我想要的是在我的函数中收听TestMain并运行或退出测试。但我希望它由用户控制,这样我就可以设置我的测试环境,并且测试将在我的命令下运行。


但可悲的是,似乎在运行时go test ...直接stdin映射到/dev/null. 因此,当我尝试阅读时os.Stdin,会出现EOF错误。最低限度的代码是:


package tests


import (

    "bufio"

    "fmt"

    "os"

    "testing"

)


func TestMain(m *testing.M) {

    reader := bufio.NewReader(os.Stdin)

    if input, err := reader.ReadString('\n'); err != nil {

        fmt.Println(err)

        fmt.Println("-----------")

        fmt.Println(input)

        os.Exit(1)

    }

    fmt.Println("ESCAPED!")

    os.Exit(m.Run())

}

我已经在圈子中阅读了如何模拟单元测试和排序,但我的案例更多的是功能测试运行器。有没有办法,甚至是一些诡计,可以让我打开或更改测试过程stdin?


千万里不及你
浏览 192回答 1
1回答

慕桂英4014372

您可以重定向os.Stdin,但它取决于操作系统:package testsimport (    "fmt"        "os"        "testing"    "bufio"    "runtime")func TestMain(m *testing.M) {    var ttyName string    if runtime.GOOS == "windows" {        ttyName = "con"    } else {        ttyName = "/dev/tty"    }       f, err := os.Open(ttyName)    if err != nil {        panic(err)    }    defer f.Close()    oldStdin := os.Stdin    defer func() { os.Stdin = oldStdin }()    os.Stdin = f    reader := bufio.NewReader(os.Stdin)        if input, err := reader.ReadString('\n'); err != nil {        fmt.Println("Error:", err)        fmt.Println("-----------")        fmt.Println(input)        os.Exit(1)    }    fmt.Println("ESCAPED!")    os.Exit(m.Run())}func TestHello(t *testing.T){    fmt.Println("Hello")}
随时随地看视频慕课网APP

相关分类

Go
我要回答